属性赋值
通过@Value来给变量赋值
使用@Value赋值:
1、基本数值
2、可以写spEL; #{}
3、可以写${}; 取出配置文件【properties】中的值(在运行环境变量里面的值)
eg:
@Value("1")
private String id;
@Value("${person.name}")
private String name;
@Value("#{20-2}")
private Integer age;
使用配置文件要在配置类上加上配置文件的位置
//使用@PropertySource读取外部配置文件中的K/V,保存到运行的环境变量中;
//加载完外部的配置文件以后使用${}取出配置文件的值
@PropertySource("classpath:/person.propertites")
PropertySource是可重复注解,可以写多个
因为配置文件的内容都会保存到运行环境中,所以也可以这么获取:
context是容器
String s = context.getEnvironment().getProperty("person.name");
System.out.println(s);
自动装配
@Autowired&@Qualifier&@Primary
自动装配:Spring利用依赖注入(DI),完成对ioc容器中各个组件的依赖关系赋值
@Autowired自动装配
1、自动装配会优先按照类型去容器中找对应的组件
【applicationContext.getBean(Dog.class)】
2、如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找
【applicationContext.getBean(“dog”);】
@Primary,让Spring进行自动装配的时候,默认优先装配哪个bean
@Qualifier,来指定需要装配的组件的id,而不是使用一开始默认的属性名
通过@Autowired,来自动装配bean对象,自动赋值一定要讲属性赋值好,没有会报错
可以使用 @Autowired(required = false) 来设定非必须
这里有个问题:@Autowired自动装配,如果自己在有多个bean的情况下显示调用applicationContext.getBean(Dog.class)会抛异常,因为你有多个但你只接收一个。
@Resource&@Inject&@Autowired
@Resource(JSR250)和@Inject(JSR330) 【都是java规范的注解】
@Resource:
可以和@AutoWired一样实现自动装配功能;默认是按照组件名称进行装配的
不支持@Primary功能、@Autowired(required=false)
@Inject:
需要导入【javax inject】依赖才能使用,和 @AutoWired的功能一样。没有required=false的功能
@Autowired:
功能强大,支持自动装配,有required=false功能,支持@Primary功能
但只能使用于Spring框架
使用哪个看公司的要求和个人爱好吧!关于@Autowired还有个隐藏问题写在了@Autowired注解那篇里了
构造器、参数、方法的自动装配
@Autowired:构造器、参数、方法、属性都可标注;都是从ioc容器中获取
1、标注在方法位置:
@Bean + 方法参数:参数从容器中获取;默认不写@Autowired效果是一样的;都能自动装配
2、标注在构造器上;
如果组件只有一个有参构造器(指没有无参构造器,一个有参构造器),这个有参构造器的@Autowired可以省略,参数位置的组件还是可以自动从容器中获取
3、标注在参数上
@Autowired的内容还是可以看看这个标签下的第一篇文章
Aware注入Spring底层组件&原理
自定义组件想要使用Spring容器底层的一些组件(ApplicationContext,BeanFactory,…)
自定义组件可以通过实现xxxAware;在创建对象的时候,会调用接口规定的方法注入相关的组件;Aware
xxxAware:功能使用xxxProcessor,如:
ApplicationContextAware ===> ApplicationContextAwareProcessor
每一个Aware都有对应的Processor
@Profile
@Profile,指定组件在哪个环境下才能被注册到容器中
1、加了@Profile环境标识的bean,只有这个环境被激活的时候才能注册到容器当中。默认是default环境
2、当@Profile写在配置类上,只有指定的环境的时候,整个配置类里面的所有配置才能开始生效
3、没有标注@Profile环境标识的bean,在任何情况下都加载