一 使用@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在,任何环境下都是加载的;(前提是整个配置类生效的情况下)