【Spring注解】属性赋值

Spring注解 属性赋值

  • @Value
    • @PropertySource
  • @Autowire
    • 标在属性
      • Autowire标在属性上自动注入流程
      • @Qualifier
      • @Primary
      • 示例
      • 底层实现
  • @PropertySource
  • @Resource
  • @Inject
  • Profile
    • 切换环境
      • 使用命令行动态参数
      • 使用代码方式

【Spring注解】属性赋值_第1张图片

@Value

使用@Value给属性赋值:

  • 基本数值
    在这里插入图片描述

  • 可以写SpEL, #{}

    【Spring注解】属性赋值_第2张图片

  • 可以写${}, 取出配置文件properties中的值

    @PropertySource

    1. 首先要在配置类中 用@PropertySource 把对应的配置文件保存到运行的环境变量中
      【Spring注解】属性赋值_第3张图片
      person.properties的内容
      person.nickName=aaa
      
    2. 通过${} 来取相应的值
      在这里插入图片描述

@Autowire

@Autowire 可以标注在属性\方法\参数\构造器上

标在属性

Autowire标在属性上自动注入流程

@Autowire 自动注入的原理:

  • 默认优先按照类型去容器中找对应的组件

    applicationContext.getBean(BookDao.class)//按类型
    
  • 如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中找

    applicationContext.getBean("bookDao")//按名称
    

    这时候还要看@Qulifier 注解和@Primary 注解【Spring注解】属性赋值_第4张图片

  • 如果一个BookDao都没有,默认会报错.即自动装配默认一定要将属性赋值好
    如果在Autowired属性中指定 required=flase 则 不会报错

    @Autowired(required=false)
    

@Qualifier

@Qualifier可以指定需要装配的组件的id 而不是使用属性名

【Spring注解】属性赋值_第5张图片

@Primary

@Primary 可以让Spring进行装配的时候默认使用首选的Bean
【Spring注解】属性赋值_第6张图片

示例

所以当我们有如下两个BookDao时,

  • 通过@Repository注入到容器中的BookDao
    【Spring注解】属性赋值_第7张图片

  • 在配置类中给容器中加一个BookDao,命名为bookDao2
    【Spring注解】属性赋值_第8张图片

由于BookService中写的属性名是bookDao,所以就会匹配到第一个通过@Repository注入到容器中的BookDao,因为它默认的id为booDao.

如果我们想让他装配成bookDao2,方法有以下几种:

  • 将BookService中写的属性名改成booDao2即可

  • 使用 @Qualifier(“bookDao2”) 指定

  • 在bookDao2 上写@primary 注解

底层实现

AutowiredAnnotationBeanPostProcessor 解析完成自动装配功能

@PropertySource

【Spring注解】属性赋值_第9张图片

@Resource

可以和@Autowired 一样实现自动装配功能,默认是按照属性名称进行装配的
【Spring注解】属性赋值_第10张图片
我们可以通过@Resource 的name属性指定要注入的BookDao

@Resource(name="bookDao2")

【Spring注解】属性赋值_第11张图片

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

@Inject

第一步:导入依赖


<dependency>
    <groupId>javax.injectgroupId>
    <artifactId>javax.injectartifactId>
    <version>1version>
dependency>

【Spring注解】属性赋值_第12张图片

@Inject 和@Autowired 差不多,所以Inject支持@Primary

但区别在于 没有required属性,所以没有@Autowired(required=false)功能

Profile

Profile可以根据当前环境,动态的激活和切换一系列组件.

组件上用@Profile注解做一个环境标识,如果当前环境被激活了 ,有当前环境标识的组件才会被注册到容器中.

@profile:指定组件在那个环境的情况下才能被注册到容器中

  • 加了环境标识的bean,只能这个环境被激活的时候才能注册到容器中
  • 默认是default环境,也就是@Profile(“default”)的bean 可以在不指定环境的时候注入到ioc容器中

@profile 可以写在类上,写在配置类上只有是在指定的环境的时候,整个配置类里面的所有配置才开始生效

示例:
【Spring注解】属性赋值_第13张图片

我们不同的环境需要用到不同的数据源, 如下:
我们在配置类中 注入三种 数据源,分别是

  • 测试环境用的数据源dataSourceTest
    【Spring注解】属性赋值_第14张图片

  • 开发环境用的数据源dataSourceDev
    【Spring注解】属性赋值_第15张图片

  • 生产环境用的数据源dataSourceProd
    【Spring注解】属性赋值_第16张图片

切换环境

使用命令行动态参数

运行时选这个 【Spring注解】属性赋值_第17张图片

	-Dspring.profiles.active=test #激活test环境

这里的环境标识 我们通过profile 设置的时 test dev 和prod 三种
【Spring注解】属性赋值_第18张图片

使用代码方式

原来我们都用的是下面的有参构造器:

AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfProfile.class);

查看此构造器源码我们可以看到是以下三步:

  1. 执行无参构造
  2. 注册主配之类
  3. 启动刷新容器
    【Spring注解】属性赋值_第19张图片
    这样就直接启动了,我们没办法设置环境变量, 所以我们要用无参构造器把这三步中间加一步设置环境变量,如下:

【Spring注解】属性赋值_第20张图片

你可能感兴趣的:(Spring,value,属性赋值,properties)