我随意写,你随意看。

林老头儿

但愿绝望和无奈远走高飞

Fork me on Gitee

Spring注解驱动开发3:自动装配

Spring注解驱动开发系列:

  1. Spring注解驱动开发1:组件注册
  2. Spring注解驱动开发2:生命周期和属性赋值
  3. Spring注解驱动开发3:自动装配
  4. Spring注解驱动开发4:AOP使用和原理
  5. Spring注解驱动开发5:Spring声明式事务
  6. Spring注解驱动开发6: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的增强。

posted @ 2020-05-18 10:24  林老头儿  阅读(223)  评论(0编辑  收藏  举报