zoukankan      html  css  js  c++  java
  • 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的增强。

  • 相关阅读:
    洛谷
    洛谷
    洛谷
    洛谷
    模板
    .
    洛谷
    洛谷
    洛谷
    poj 2955"Brackets"(区间DP)
  • 原文地址:https://www.cnblogs.com/jinchengll/p/12909088.html
Copyright © 2011-2022 走看看