使用@Value给属性赋值:
可以写SpEL, #{}
可以写${}, 取出配置文件properties中的值
@Autowire 可以标注在属性\方法\参数\构造器上
@Autowire 自动注入的原理:
默认优先按照类型去容器中找对应的组件
applicationContext.getBean(BookDao.class)//按类型
如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中找
applicationContext.getBean("bookDao")//按名称
如果一个BookDao都没有,默认会报错.即自动装配默认一定要将属性赋值好
如果在Autowired属性中指定 required=flase 则 不会报错
@Autowired(required=false)
@Qualifier可以指定需要装配的组件的id 而不是使用属性名
@Primary 可以让Spring进行装配的时候默认使用首选的Bean
所以当我们有如下两个BookDao时,
由于BookService中写的属性名是bookDao,所以就会匹配到第一个通过@Repository注入到容器中的BookDao,因为它默认的id为booDao.
如果我们想让他装配成bookDao2,方法有以下几种:
将BookService中写的属性名改成booDao2即可
使用 @Qualifier(“bookDao2”) 指定
在bookDao2 上写@primary 注解
AutowiredAnnotationBeanPostProcessor 解析完成自动装配功能
可以和@Autowired 一样实现自动装配功能,默认是按照属性名称进行装配的
我们可以通过@Resource 的name属性指定要注入的BookDao
@Resource(name="bookDao2")
@Resource 没有能支持@Primary 和@Autowired(required=false)功能
第一步:导入依赖
<dependency>
<groupId>javax.injectgroupId>
<artifactId>javax.injectartifactId>
<version>1version>
dependency>
@Inject 和@Autowired 差不多,所以Inject支持@Primary
但区别在于 没有required属性,所以没有@Autowired(required=false)功能
Profile可以根据当前环境,动态的激活和切换一系列组件.
组件上用@Profile注解做一个环境标识,如果当前环境被激活了 ,有当前环境标识的组件才会被注册到容器中.
@profile:指定组件在那个环境的情况下才能被注册到容器中
@profile 可以写在类上,写在配置类上只有是在指定的环境的时候,整个配置类里面的所有配置才开始生效
我们不同的环境需要用到不同的数据源, 如下:
我们在配置类中 注入三种 数据源,分别是
-Dspring.profiles.active=test #激活test环境
这里的环境标识 我们通过profile 设置的时 test dev 和prod 三种
原来我们都用的是下面的有参构造器:
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfProfile.class);
查看此构造器源码我们可以看到是以下三步: