通过注解方式注入bena,除了xml配置,还可以通过注解配置,简化了配置文件,提高开发效率,spring有专门的注解 解释器,对定义的注解进行解析,实现bena对象的注入,通过反射技术实现。
1:修改配置文件
引入context:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
</beans>
开启自动化注入:
配置在spring.xml里:
开启自动注入
<context:annotation-config/>
2:@Resource
- 默认使用字段名查找bean标签,属性字段名字=bean标签的id值。
- 当属性字段名和bean标签的id不一致,则使用Class类型查找。
- 属性字段也可以不提供set方法。
- 注解可以声明在属性字段名上,或set方法上。
- 可以通过注解的name属性设置查找方式,设置name必须让name值和bean的id一致。
- 如果接口只有一个实现则正常实例化,如果有多个实现,必须用name指定实现类。
UserService类:
属性:
- UserDao
- AccountDao
- 接口:IDao
接口存在两个实现类:UserDao和AccountDao
public class UserService {
//将注解声明在字段上或者set方法上
private UserDAO userDAO;
@Resource(name = "account")
private AccountDao accountDao;
//注入接口
@Resource(name ="account")
private IDao iDao;
public UserService(){
}
public UserService(UserDAO userDAO) {
this.userDAO = userDAO;
}
@Resource(name="userDao")
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
public void testService(){
System.out.println("userService......");
userDAO.testDao();
accountDao.testAccount();
accountDao.interfaceTest();
iDao.interfaceTest();
System.out.println(iDao==accountDao);//true
}
}
spring.xml:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--开启自动注入-->
<context:annotation-config/>
<!--实例化对象-->
<bean id="userDao" class="dao.UserDAO"></bean>
<bean id="account" class="dao.AccountDao"></bean>
<bean id="userService" class="service.UserService"></bean>
</beans>
3:@Autowired
- 默认使用Class查找bean对象,和属性字段名无关。
- 可以提供或者不提供set方法。
- 可以声明在属性上也可以声明在set上。
- 通过 @Autowired+@Qualifier(value =
“”)两个注解+value的值区分bean,且value的值和bean的id一致。
CatService类:
属性:
DogDao
ICat接口:存在两个实现类
public class CatService {
//使用autowired和qualifier组合 通过value区分bean
@Autowired
@Qualifier(value = "iCat1")
private ICat ic;
//autowired按照类型找,字段名可以和bean的id不一致
private DogDao dog;
public void setIc(ICat ic) {
this.ic = ic;
}
@Autowired
public void setDao(DogDao dao) {
this.dog = dog;
}
public void test(){
ic.ICatTest();
dog.testDog();
}
}
spring.xml:
<bean id="dogDao" class="dao.DogDao"></bean>
<bean id="iCat1" class="dao.MonDao"></bean>
<bean id="iCat2" class="dao.CatDao"></bean>
<bean id="catService" class="service.CatService"></bean>