Spring中的注解学习(二)

本文深入讲解Spring框架中依赖注入的多种方式,包括@Value、@Autowired、@Resource和@Inject注解的使用,以及自动装配的原理和配置。探讨了如何在不同环境下激活特定组件,并介绍了如何使用@Profile注解来实现这一目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一  使用@Value进行属性赋值

1.基本数值   

           @Value("张三")

           private String anme;

2.Spel : #{}

           @Value("#{20-2}")

           private Integer age;

2.${}  取出配置文件中的值{}

      1)在配置类上  使用@PropertySource读取外部配置文件中的K/V保存到运行环境的变量中,使用${}取出配置文件中的值

           @PropertySource(value={"classpath:/person.properties"})

       2 )@Value("${person.nickName}")

            private String nickName;

二  自动装配

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

1.@Autowired  : 自动注入;一个组件需要另一个组件作为属性

    1)默认优先按照类型去容器中找到对应的组件:applicationContent.getBean(BookDao.class);找到直接进行赋值

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

     3) @Qualifier("bookDao") ,使用@Qualifier指定装配的组件的id,而不是使用属性名。

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

           可以使用@Autowired(required=false);指定非必须的,IOC容器中有就装配,否则不装配,赋值为空。

      5)@Primary: 让Spring进行自动装配的时候,默认使用首选的bean; 也可以使用@Qualifier指定需要装配的Bean的名字。 

 BookService{

       @Qualifier("bookDao2")

       @Autowired

       BookDao bookDao;

}

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

    @Resource: 

                 1)可以和@Autowired一样实现自动装配功能:默认是按照组件的名称进行装配,也可以@Resource("bookDao1")指                         定装配的组件名。

                 2) 没有支持@Primary功能  没有支持@Autowired(required=false)    

     @Inject:

                  需要导入javax.inject的包,和Autowired的功能一样。没有required=false的功能。

  区别:@Autowired:Spring定义的;@Resource,@Inject都是Java规范。

AutowiredAnnotationBeanPostProcessor:解析完成自动装配功能。

3.@Autowired:构造器,参数,方法,属性  都是从IOC容器中获取组件的值。

     1)标注在方法上:(@Bean+方法参数;参数从容器中获取    用的较多)  ,Spring容器创建当前对象,就会调用方法,完成复制;方法使用的参数,自定义类型从IOC容器中获取。

        例如:  

              @Autowired

             public void setCar(/*@Autowired也可以放在这里*/Car car){

                      this.car = car;

}

     例如:

        @Bean标注的方法创建对象的时候,方法参数的值从容器中获取,默认不写Autowired,都能自动装配

        @Bean

        public Color color(Car car){

             Color color = new Color();

              color.setCar(car);

}

       

    2)标注在构造器上如果组件中只有一个构造器,这个构造器的@Autowired可以省略,参数位置的组件还是可以自动从容器中获取):默认加载IOC容器的组件,容器启动会调动无参构造器创建对象,在进行初始化赋值等操作

       例如: 

               @Autowired

                public Boss(/*@Autowired也可以放在这里效果同上*/ Car car){

                          this.car = car;

}

3)自定义组件想要使用Spring容器底层的一些组件(ApplicationContent ,BeanFactory,xxx  等等)

      自定义组件实现xxxAware:在创建对象的时候,会调用接口规定的方法注入相关的组件;

       把Spring底层一些组件注入到自定义的Bean中;

       xxxAware:   功能使用xxxProcessor;

       ApplicationContextAware     ===>    AppliationContentAwareProcessor;

三  @profile:指定组件再哪个环境的情况下才能被注册到容器中,不指定,任何环境下都能注册这个组件。

         例如:

          Spring为我们提供的可以根据当前环境,动态的激活和切换一系列组件的功能

         我们需要在开发环境,测试环境,生产环境,切换不同的数据源:(/A) (/B) (/C);

     (1)加了环境标识的bean(写在了类上),只有这个环境被激活的时候才能被注册到容器中。默认是default环境。

               1)使用命令行动态参数:在虚拟机参数位置加载-Dspring.profiles.active=test

                2)  设置需要激活的环境  :applicationContent.getEnvironment().setActiveProfiles("test","dev");

                     注册主配置类 : applicationContext.register(MainConfigOfProfile.class);

                      启动刷新器: applicationContext.refresh();

     (2)写在配置类上,只有是指定的环境的时候,整个配置类里面的所有配置才能开始生效。

     (3)没有标注环境标识的bean在,任何环境下都是加载的;(前提是整个配置类生效的情况下)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值