Spring注解驱动开发系列:
Spring注解驱动开发3:自动装配
自动装配:Spring利用依赖注入(DI),完成对IOC容器中各个组件的依赖关系复制。
@Autowired-自动装配
对注释的bean进行装配。
例子
编写UserService代码如下:
@Service
public class UserService {
//默认优先按照类型去IOC容器中找对应的组件,如果存在多个实例,再将属性名称作为name查找Bean
@Autowired
public UserDao userDao;
}
编写MainTest代码如下:
public class MainTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new
AnnotationConfigApplicationContext(MainConfigure.class);
UserService userService = (UserService) applicationContext.getBean("userService");
System.out.println(userService.userDao);
}
}
输出如下:
com.lin.springL.dao.UserDao@5cdd8682
可以看到我们并没有对UserService中的UserDao进行赋值,但是Spring已经帮我们自动装配上了UserDao。
扩展
-
可以通过@Qualifier("userDao1")来指定装备bean的名称。
-
Autowired可以用于构造器、参数、方法、属性,例如更改UserService代码如下:
@Service public class UserService { public UserDao userDao; @Autowired public UserService(UserDao userDao) { this.userDao = userDao; } }
同样可以自动获得UserDao对象。
@Resource(JSR250)和@Inject(JSR330)
Spring也支持@Resource(JSR250)和@Inject(JSR330)来对Bean进行自动装配,使用方式与Autowired差不多,就不多描述。
自动装配-Aware注入Spring底层组件&原理
自定义组件想要使用Spring容器底层的一些组件(ApplicationContext、BeanFactory、XXX),可以自定义组件实现XXXAware接口,在创建对象的时候,会调用接口规定的方法注入相关组件。
例子
获取ApplicationContext:
修改UserDao类实现ApplicationContextAware接口并实现对应方法:
@Component
public class UserDao implements ApplicationContextAware {
ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.applicationContext = applicationContext;
}
}
原理
通过BeanPostProcessor后置处理器来处理,比如ApplicationContextAware,对应的处理器是ApplicationContextAwareProcessor,又可以看到:
class ApplicationContextAwareProcessor implements BeanPostProcessor {
其实现了BeanPostProcessor,所以其也是Bean的增强。