zoukankan      html  css  js  c++  java
  • (一)IOC 容器:【10】@Autowired 自动装配

    一、自动装配

      Spring 利用依赖注入(DI),完成对 IOC 容器中各个组件的依赖关系赋值。

      

    二、@Autowired 自动注入

      1、按照类型

        默认优先按照类型去容器中找对应的组件:applicationContext.getBean(BookDao.class);

    @Service
    public class BookService {
    
        //到容器中按类型进行查找对应的组件
        @Autowired
        private BookDao bookDao;
    }

      2、多个组件,再按id找

        如果在容器中找到多个相同类型的组件,再将属性的名称作为组件的 id 去容器中查找:applicationContext.getBean("bookDao");

    @Service
    public class BookService {
    
        //到容器中按类型进行查找对应的组件,如果有多个组件,按属性的id去查找
        @Autowired
        private BookDao bookDao;
    }

      3、指定要装配的组件

        可以使用  @Qualifier(name) 注解指定要装配的组件id,而不再使用属性名作为 id;

    @Service
    public class BookService {
         
         @Qualifier("bookDao2")    //指定要装配的组件id,不再使用属性名
         @Autowired
         private BookDao bookDao;
         
         public void print() {
             System.out.println(bookDao);
         }
    }

      4、是否必须装配

        Spring 自动装配默认一定要将属性赋值好,没有就会报错。

        可以使用 @Autowired(required=false) 来指定是否必须装配到组件。

        required = false,表示不用必须装配,如果找到组件就装配,没有找到就不进行装配,不会报错。

    @Service
    public class BookService {
         
         @Qualifier("bookDao")
         @Autowired(required=false)   //找到则装配,没找到不装配
         private BookDao bookDao;
         
         public void print() {
             System.out.println(bookDao);
         }
    }

      5、使用首选 Bean

        @Primary 让 Spring 进行自动装配的时候,默认使用首选的 bean 来装配。

        默认装配首选的 bean,也可以继续使用  @Qualifier 指定需要装配的 bean 的名字。

        组件一:

        

         组件二:

        

         自动装配:

        

         测试:

      @Autowired 是通过 AutoWiredAnnotationBeanPostProcessor:解析完成自动装配功能

    三、其他装配

      Spring 还支持使用 @Resource(JSR250) 和 @Inject(JSR330) 【Java规范的注解】

      @Resource:

        Java 规范,可以和 @Autowired 一样实现自动装配。默认是按照组件名称进行装配的。

        @Resource(name=" ") 也可以使用 name 属性来指定组件。

        不能支持 @Primary、不支持 @Autowired(required=false)

    @Service
    public class BookService {
         
         @Resource(name="bookDao")
         private BookDao bookDao;
         
         public void print() {
             System.out.println(bookDao);
         }
    }

      @Inject:

        需要导入 javax.inject 的包,和 @Autowired 功能一样;

        没有required=false 的功能

    @Service
    public class BookService {
         
         @Inject
         private BookDao bookDao;
         
         public void print() {
             System.out.println(bookDao);
         }
    }

      三者区别:

        @Autowired 是 Sprig 定义的,@Resource 、@Inject 都是java规范;

      

    四、@Autowired 其他用法

       @Autowired 可以使用的位置:

      @Autowired 可以作用在构造器、方法、参数、属性等位置,获取都是从容器中获取参数组件的值。

      1、标注在方法位置

        常用情况:@Bean 与 方法参数标注时:参数都是从容器中获取;默认不写 @Autowired,都能自动装配;

        示例:

        //标注在方法,Spring 容器创建当前对象,就会调用方法,完成赋值 setter 方法
        //方法使用的参数,自定义类型的值就从 IOC 容器中获取
        @Autowired
        public void setCar(Car car) {
            this.car = car;
        }

      2、标注在构造器位置

        默认加在 ioc 容器中的组件,容器启动会调用无参构造器创建对象,再进行初始化赋值等操作;
        //构造器要用的组件,都是从容器中获取
        @Autowired
        public Boss(Car car) {
            super();
            this.car = car;
        }
    
        //构造器要用的组件,都是从容器中获取
        public Boss(@Autowired Car car) {
            super();
            this.car = car;
        }
    
        //构造器要用的组件,都是从容器中获取,只有一个有参构造器,@Autowired还可以省略
        public Boss(Car car) {
            super();
            this.car = car;
        }

        如果组件只有一个构造器,这个有参构造器的 @Autowired 可以省略,参数位置的组件还是自动可以从容器中获取。

      3、标注在参数位置

        示例:

         public void setCar(@Autowired Car car) {
             this.car = car;
         }

        示例2:

         //@Bean 标注的方法创建对象的时候,方法参数的值从容器中获取
         @Bean
         public Color color(@Autowired Car car) {
             Color color = new Color();
             color.setCar(car);
             return color;
         }
  • 相关阅读:
    bzoj 4446: [Scoi2015]小凸玩密室【树形dp】
    bzoj 4403: 序列统计【lucas+组合数学】
    bzoj 3745: [Coci2015]Norma【分治】
    bzoj 3232: 圈地游戏【分数规划+最小割】
    Codeforces 1000 (A~E)
    bzoj 4753: [Jsoi2016]最佳团体【01分数规划+二分+树上背包】
    bzoj 3872: [Poi2014]Ant colony【树形dp+二分】
    bzoj 2067: [Poi2004]SZN【贪心+二分+树形dp】
    洛谷 P1314 聪明的质监员【二分+前缀和】
    bzoj 4622: [NOI 2003] 智破连环阵【dfs+匈牙利算法】
  • 原文地址:https://www.cnblogs.com/niujifei/p/15551890.html
Copyright © 2011-2022 走看看