Spring IOC注解的快速入门

1.1.创建Java工程并导入jar包
maven配置:

 <dependencies>

	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-context</artifactId>
	    <version>4.2.4.RELEASE</version>
	</dependency>
	
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-aop</artifactId>
	    <version>4.2.4.RELEASE</version>
	</dependency>
	
  </dependencies>

spirng 整合junit ,程序中引入spring-test.jar

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>4.2.4.RELEASE</version>
    <scope>test</scope>
</dependency>

1.2.创建包结构并编写Java类
1.UserService接口

package com.icbc.study.service;

public interface UserService {

	/**
	 * 业务层:用户保存
	 */
	public void save();
}

2.UserServiceImpl实现类
在Java类上添加注解
在UserServiceImpl实现类上添加注解@Service,相当于,value属性给bean指定id,value属性的名字也可以不写,直接写一个值

import org.springframework.stereotype.Service;

import com.icbc.study.service.UserService;

@Service("userService")
public class UserServiceImpl implements UserService {

	@Override
	public void save() {
		System.out.println("业务层:用户保存");
	}

}

3.在applicationContext.xml中引入约束.
src目录下,创建applicationContext.xml的配置文件,引入约束。注意:因为现在想使用注解,那么需要context的约束。

4.在applicationContext.xml中开启注解扫描.

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
      <!-- 开启注解扫描 -->
      <context:component-scan base-package="com.icbc.study.service"></context:component-scan>
      
</beans>

5.编写测试代码

package com.icbc.study.test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.icbc.study.service.UserService;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Testt {
	@Autowired
	private UserService userService;
	
	@Test
	public void test1(){
		userService.save();
	}
}

2.Spring框架中bean管理的常用注解.
A.(创建对象的)
2.1.1.@Component注解
作用:
把资源让spring来管理。相当于在xml中配置一个bean。
属性:
value:指定bean的id。如果不指定value属性,默认bean的id是当前类的类名。首字母小写。
2.1.2.@Controller @Service @Repository
他们三个注解都是针对一个的衍生注解,他们的作用及属性都是一模一样的。
他们只不过是提供了更加明确的语义化。
@Controller:一般用于表现层的注解。
@Service:一般用于业务层的注解。
@Repository:一般用于持久层的注解。

B.2.2.用于注入数据的

相当于:<property name="" ref=""> <property name="" value="">

2.2.1.@Value
作用:
注入基本数据类型和String类型数据的
属性:
value:用于指定值
2.2.2.@Autowired(重点)
作用:
自动按照类型注入。当使用注解注入属性时,set方法可以省略。它只能注入其他bean类型。当有多个类型匹配时,使用要注入的对象变量名称作为bean的id,在spring容器查找,找到了也可以注入成功。找不到就报错.

package com.icbc.study.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.icbc.study.dao.UserDao;
import com.icbc.study.service.UserService;

@Service("userService")
public class UserServiceImpl implements UserService {

	@Autowired
	private UserDao userDao;
	@Value("张三")
	private String name;
	@Override
	public void save() {
		System.out.println("业务层:用户保存");
		System.out.println("用户名:" + name);
		userDao.save();
	}

}

2.2.3.@Qualifer
作用:
在自动按照类型注入的基础之上,再按照Bean的id注入。它在给字段注入时不能独立使用,必须和@Autowire一起使用;但是给方法参数注入时,可以独立使用。
属性:
value:指定bean的id。
1.创建UserDao接口的第二个实现类UserDaoImpl2

@Repository("userDaoImpl2")
public class UserDaoImpl2 implements UserDao {

	@Override
	public void save() {
		System.out.println("持久层2:保存用户");
	}

}

2.测试发现,UserServiceImpl中注入的还是第一个UserDaoImpl,想指定注入UserDaoImpl2,需要使用@Qualifier注解根据名字来注入

@Service("userService")
public class UserServiceImpl implements UserService {

	@Autowired
	@Qualifier("userDaoImpl2")
	private UserDao userDao;
	@Value("张三")
	private String name;
	@Override
	public void save() {
		System.out.println("业务层:用户保存");
		System.out.println("用户名:" + name);
		userDao.save();
	}

}

@Resource
作用:
直接按照Bean的id注入。它也只能注入其他bean类型。
属性:
name:指定bean的id。

C.
2.3.用于改变作用域范围的
2.3.1.@Scope
作用:
指定bean的作用范围。
属性:
value:指定范围的值。
取值:singleton prototype request session globalsession.
例如:

@Service("userService")
@Scope("singleton")
public class UserServiceImpl implements UserService {

	@Autowired
	@Qualifier("userDaoImpl2")
	private UserDao userDao;
	@Value("张三")
	private String name;
	@Override
	public void save() {
		System.out.println("业务层:用户保存");
		System.out.println("用户名:" + name);
		userDao.save();
	}

}

测试方法。

@Service("userService")
@Scope("singleton")
public class UserServiceImpl implements UserService {

	@Autowired
	@Qualifier("userDaoImpl2")
	private UserDao userDao;
	@Value("张三")
	private String name;
	@Override
	public void save() {
		System.out.println("业务层:用户保存");
		System.out.println("用户名:" + name);
		userDao.save();
	}

}

修改scope中的值,两次运行的结果是不一样的。

D.
和生命周期相关的 相当于:

<bean id="" class="" init-method="" destroy-method="" />

@PostConstruct
@PostConstruct加在方法上,指定bean对象创建好之后,调用该方法初始化对象,类似于xml的init-method方法

@PreDestory注解
@PreDestory加在方法上,指定bean销毁之前,调用该方法,类似于xml的destory-method方法

3.XML和注解的比较
注解的优势:
配置简单,维护方便。(我们找到了类,就相当于找到了配置)
XML的优势:
修改时,不用改源码。不涉及重新编译和部署。
Xml和注解的比较
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/tangiwang/article/details/84107403