代码改变世界

@Autowired 注释

2018-11-29 10:23  Echo.  阅读(381)  评论(0)    收藏  举报
 
基本用法: 作用于构造器、方法、参数、属性
@Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Autowired的使用来消除 set ,get方法。在使用@Autowired之前,我们对一个bean配置起属性时,是这样用的
<property name="属性名" value=" 属性值"/>
 
原理:那么使用@Autowired的原理是什么?
  其实在启动spring IoC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
 
注意事项:
在使用@Autowired时,首先在容器中使用byType查询对应类型的bean, 如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据, 如果查询的结果不止一个,那么@Autowired会通过ByName名称来查找。如果查询的结果为空,那么会抛出异常。解决方法:使用@Autowired(required = false)
 
有2个或2个以上的类实现了同一个接口, 那么在使用注入接口实现类的时候需要同时使用@Autowired,@Qualifier注解, 用来指定注入特定的bean。
 
案例演示:
UserRepository 接口定义了一个save方法
 
package com.company.repository;
 
public interface UserRepository {
    void save();
}
 
再定义一个UserRepository接口的实现类UserRepositoryImpl 实现了save方法
 
package com.company.repository;
 
import org.springframework.stereotype.Repository;
 
// 定义该bean id为 userRepository
@Repository("userRepository")
public class UserRepositoryImpl implements UserRepository {
 
    @Override
    public void save() {
        System.out.println("UserRepositoryImpl save");
    }
}
 
定义一个业务逻辑组件UserService, 加入一个UserRepository类型的成员变量, 使用@Autowired注解自动从Ioc容器去查找bean
 
package com.company.service;
 
import com.company.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
 
@Service("userService")
public class UserService {
 
    @Autowired
    private UserRepository userRepository;
 
    public void save(){
        userRepository.save();
    }
}
 
这段代码输出 UserRepositoryImpl save
 
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
 
UserService userService = (UserService)context.getBean("userService");
userService.save()
 
再定义一个UserRepository接口的实现类UserJdbcImpl实现了save方法
 
package com.company.repository;
 
import org.springframework.stereotype.Repository;
 
@Repository("userJdbc")
public class UserJdbcImpl implements UserRepository {
 
    @Override
    public void save() {
        System.out.println("UserJdbcImpl save");
    }
}
 
修改UserService
 
package com.company.service;
 
import com.company.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
 
@Service("userService")
public class UserService {
 
    /*
    * 会实例化 @Repository("userJdbc") 注解的类
    * */
    @Autowired
    private UserRepository userJdbc;
 
    /*
    * 会实例化 @Repository("userRepository") 注解的类
    * */
    @Autowired
    private UserRepository userRepository;
 
    /*
    * @Qualifier 用来指定需要装载的bean的名称
    * */
    @Autowired
    @Qualifier("userRepository")
    private UserRepository myUserRepository;
 
    public void save() {
        userJdbc.save(); //输出 UserJdbcImpl save
    }
 
    public void save1(){
        userRepository.save(); //输出 UserRepositoryImpl save
    }
 
    public void save2(){
        myUserRepository.save(); //输出 UserRepositoryImpl save
    }
}