Spring高级装配
- Profile机制
以DataSource为例,在Dev和Pro环境使用的是不一样的,这样在发布的时候需要切换配置,这样Spring就提供了Profile机制,基于哪个profile激活了才装配该profile配置的bean。
@Profile("dev")
<beans …… profile="dev"/>
- 条件化的Bean
Spring4后才支持的一种功能:完全根据你的需要来创建bean(希望某个bean在特定路径下包含特定库时才创建、bean依赖于某个特定bean创建完成之后才创建、某个特定环境变量设置后才创建)。
@Bean
// 只有在MagicExistCondition创建了才会创建MagicBean
@Conditional(MagicExistCondition.class)
public MagicBean magicBean(){
return new MagicBean();
}
@Conditional是判断条件是否为true,所以MagicExistCondition实现了Condition接口
public class MagicExistCondition implements Condition{
public boolean matches(){
// 这里添加代码判断是否match
}
}
- Spring限定符
在自动化装配的时候如果出现多个bean冲突的时候可以通过限定符来限定。
@Primary: 优先装配
@Qualifier: 指定装配
// 指定装配的Dessert bean id是IceCream
@Qualifier("IceCream")
public void setDessert(Dessert dessert ){ this.dessert = dessert; }
// 上述缺点,如果改名的话这里的代码也要改。
// 所以可以在bean上面定义qualifier,相当于定义一个别名吧
@Qualifier("Alias")
public class IceCream implements Dessert{}
// 这里就直接用Alias了
@Qualifier("Alias")
public void setDessert(Dessert dessert ){ this.dessert = dessert; }
// 可以给一个bean同时加多个限定符
@Qualifier("cold")
@Qualifier("creamy")
public class IceCream implements Dessert { ... }
// 也可以自定义注解限定符
@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Cold { }
@Cold
@Cualifier
public class IceCream implements Dessert { ... }
- Bean作用域
通过@Scope定义
- 运行时值注入
- 注入外部值
最简单的就是声明属性源,可以用@PropertySource声明
// 这样声明了就会把app.properties文件加载到Spring的Environment中
@PropertySource("classpath:/com/soundsystem/app.properties")
public class ExpressiveConfig{
@Autowired
Enviroment env;
@Bean
public BlankDisc disc(){
// 通过调用Spring Environment的getProperty来获取,这样就在运行时才处理值,不提前处理。
//然后在app.properties中需要定义app.properties和disc.artist
return new BlankDisc(env.getProperty("disc.title"), env.getProperty("disc.artist"))
// Environment还有很多其他方法,并且不光能获取property,还能获取profile
}
}
还有复杂一点的属性占位符${……}
- 用Spring表达式(SpEL)#{……}
这章学习的都是些零散的Bean装配的知识,可以当作手册来学习,不需要死记语法,接下来要学习AOP。