暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Spring源码从入门到精通---@Autowired&@Qualtify(十一)

后端从入门到精通 2021-08-23
189

篇文章主要讲了@Value的赋值:普通赋值,@Value("#{}"),spEl表达式赋值,@Value("&{}")读取配置文件赋值:

Spring源码从入门到精通---@Value赋值(十)


这篇文章主要介绍spring的自动装配,DI依赖注入,各个组件赋值,完成在IOC容器的组件调用。常用的@Autowird按类型去ioc容器中找组件注解,与之对应的有个@Resource按名称注解以后在讲解。

1、@Autowired

1)、默认优先[按照类型]去ioc容器中找组件 AnnotationConfigApplicationContext.getBean(BookDao.class);

2)、若此类型在容器中找到两个以上组件,则加载此方法找默认的名称AnnotationConfigApplicationContext.getBean("bookDao");

3)、可以和@Qualifier("组件名")组合使用,直接指定组件名。

4)、加载的@Autowired(required=false)必须在容器中存在此组件,IOC容器不存在则报错,默认为true,也可以指定为false,则不会报错。

5)、@Primary注解也可以指定主加载的组件,这时候就默认加载此主键的组件,除非@Qualifier指定其他组件。

     
    /**
    * @Autowired
    * Spring 的自动装配:DI依赖注入,各个组件之间的装配赋值,完成对IOC容器里各个对象之间赋值调用。
    * 1)、默认优先按照类型去ioc容器中找组件
    *
    * @author keying
    * @Autowired
    */
    @Configuration
    @ComponentScan(value = {"com.alibaba.controller","com.alibaba.service","com.alibaba.dao"})
    public class ConfigOfAutowired {


    }


       
      @Controller
      public class BookController {

      @Autowired
      private BookService bookService;

      public void print() {
      System.out.println(bookService);
      }
      }


      /**
      * @author keying
      * 加载进的ioc容器里的名字:默认首字母小写
      */
      @Repository
      public class BookDao {


      }


      @Service
      public class BookService {

      @Autowired
      private BookDao bookDao;

      public void print() {
      System.out.println("BookService注入的bookDao:" + bookDao);
      }

      @Override
      public String toString() {
      return "BookService{" +
      "bookDao=" + bookDao +
      '}';
      }
      }
         
        public class IOCTestAutowired {

        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(
        ConfigOfAutowired.class);

        @Test
        public void test1() {
        //getBeanNames(applicationContext);

        BookService bookService = applicationContext.getBean(BookService.class);
        BookDao bookDao = applicationContext.getBean(BookDao.class);
        System.out.println("bookService:" + bookService);
        System.out.println("bookDao:" + bookDao);
        applicationContext.close();
        }

        2、@Qualifier

         问:如果一个对象在ioc里创建两个组件,一个叫bookDao1,一个叫bookDao2,默认先加载哪个呢,如果指定加载哪个就可以用到@Qualifier("bookDao2")。代码如下:

          @Service
          public class BookService {

          @Autowired
          @Qualifier("bookDao2")
          private BookDao bookDao;

          public void print() {
          System.out.println("BookService注入的bookDao:" + bookDao);
          }

          @Override
          public String toString() {
          return "BookService{" +
          "bookDao=" + bookDao +
          '}';
          }
          }
             
            /**
            * @author keying
            * 加载进的ioc容器里的名字:默认首字母小写
            */
            @Repository
            public class BookDao {

            private String lable = "1";

            public String getLable() {
            return lable;
            }

            public void setLable(String lable) {
            this.lable = lable;
            }

            @Override
            public String toString() {
            return "BookDao{" +
            "lable='" + lable + '\'' +
            '}';
            }
            }
               @Test
              public void test1() {
              //getBeanNames(applicationContext);

              BookService bookService = applicationContext.getBean(BookService.class);
              //BookDao bookDao = applicationContext.getBean(BookDao.class);
              System.out.println("bookService:" + bookService);
              //System.out.println("bookDao:" + bookDao);


              applicationContext.close();
              }

              在Config配置文件里用@Bean注解新注册一个bookDao2组件,给BookDao类加一个lable字段,

              1)、若加载的默认bookDao对象,则会打印lable为1

              2)、若加载的bookDao对象,Autowird按类型加载,则需要用@Qualifier注解在BookService类指定加载的名称。



              文章转载自后端从入门到精通,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论