(二)spring 高级装配-Condition -条件化的bean
Condition:满足某个特定条件的情况下创建bean
条件化配置bean:
a:@Conditional 指定一个class ,它指明了通过条件对比的类。如果没有指定class则通过Conditon接口进行条件对比:
b:@Conditional 指定的类可以是任意实现了Condition接口的类
c:指定的类需要重写matches方法
1.例子1:
@Bean
@Conditional(MagicExistsConditon.class) //条件化的创建bean
public MagicBean magicBean(){
return new MagicBean();
}
Condition接口:
public interface Condition{
boolean matches(ConditionContext context,AnnotatedTypeMetadata metadata);
}
MagicExistsConditon实现类:
public class MagicExistsCondition implements Condition{
public boolean matches(ConditionContext context,
AnnotatedTypeMetadata metadata)
Environment env = context.getEnvironment();
return env.containsProperty("magic");
}
}
例子1,Conditional注解指定了实现类作为条件,如果环境中包含magic属性,则会创建magicBean;
ConditionContext 是一个接口:
public interface ConditionContext{
BeanDefinitionRegistry getRegistry();
ConfigurableListableBeanFactory getBeanFactory();
Environment getEnvironment();
ResourceLoader getResourceLoader();
ClassLoader getClassLoader();
}
通过ConditionContext可以检查bean的定义;
通过BeanFactory,可以检查bean是否存在,甚至探查bean的属性;
检查环境变量是否存在以及它的值是什么;
ResourceLoader所加载 的资源;
ClassLoader加载并检查类是否存在;
AnnotatedTypeMetadata接口:能够让我们检查带有@Bean注解的方法上还有什么其他的注解;
publlic interface AnnotatedTypeMetadata{
boolean isAnnotated(String annotationType);
Map<String,Object> getAnnotationAttributes(String annotationType);
Map<String,Object> getAnnotationAttributes(String annotationType,boolean classValuesAsString);
MultiValueMap<String,Object> getAllAnnotationAttributes(
String annotationType);
MultiValueMap<String,Object> getAllAnnotationAttributes(String annotationType,boolean classValuesAsString);
}
a:判断是否还有其他注解;
b:检查@Bean注解的方法上其他注解的属性;
例子2:@Profile注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.Type,ElementType.METHOD})
@Documented
@Conditional(ProfileCondition.class)
public @interface Profile{
String[] value();
}
Profile注解使用了@Conditional注解。
通过查看ProfileConditon的源码,可以发现,它借助ConditonContext得到Environment来检查该Profile是否处于激活状态。
public boolean matches(ConditionContext contex,AnnotatedTypeMeatadata metadata){
if(context.getEnvironment() != null){
MultiValueMap<String,Object> attrs = metadata.getAllAnnotationAttributes(Profile.class.getName());
if(atts != null){
for(Object value: attrs.get("value")){
if(context.getEnvironment().acceptsProfiles((String[]) value)){
return true;
}
return false;
}
}
return true;
}
}
例子3:处理自动装配的歧义性:
当通过@Autowared注入一个接口的时候,如果该接口有多个实现类的时候,spring,不知道该注入那个实现类的代理。
解决方法:
a:通过在实现类上添加注解@Primary与@Component同时使用,代表当出现多个的时候,此类优先注入。
b:存在多个首选的时候,通过@Qualifier注解,@Qualifier(“iceCream”),value的值代表想要注入的bean的ID
c:出现多个ID相同的时候,创建自定义限定符,即@Qualifier(“iceCream”),自定义value的值,如下,cold即自定义的限定符
@Component
@Qualifier("cold")
public class IceCream implements Dersert{......}
d:当出现重复的自定义符时,通过自定义限定符注解,自定义一个注解,加上@Qualifier注解,则自定义的注解也有了Qualifier的功能。当出现自定义限定符重复的时候,可以通过添加多个自定义限定符注解,实现要注入的是哪个bean
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.Constructor,ElementType.FILED,ElementType.METHOD,ElementType.TYPE})
@Qualifier
public @interface cold{.....}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.Constructor,ElementType.FILED,ElementType.METHOD,ElementType.TYPE})
@Qualifier
public @interface creamy{.....}
(二)spring 高级装配-Condition -条件化的bean的更多相关文章
- Spring入门(六):条件化的bean
1. 概念 默认情况下,Spring中定义的bean在应用程序启动时会全部装配,不管当前运行的是哪个环境(Dev,QA或者Prod),也不管当前运行的是什么系统(Windows或者Linux),但有些 ...
- Spring 梳理-profile与条件化定义bean
定义profile <beans> //root <beans profile="dev"> <bean id=.../> </beans ...
- @Condition 条件化注册Bean
看<Spring源码深度解析>笔记 1.@Condition: 按照一定的条件进行判断,满足条件给容器中注册bean:实例: 根据系统给容器中注册Bean,如果是windows注册(“bi ...
- 第3章—高级装配—条件化的Bean
条件化的Bean 通过活动的profile,我们可以获得不同的Bean.Spring 4提供了一个更通用的基于条件的Bean的创建方式,即使用@Conditional注解. @Conditional根 ...
- Spring高级装配
Spring高级装配 目录 一.Profile(根据开发环境创建对应的bean) 二.条件化的创建bean(根据条件创建bean) 三.处理自动装配歧义性(指定首选bean.限定符限制bean) 四. ...
- Spring高级装配bean
目录 spring profile 条件化的bean声明 自动装配与歧义性 bean的作用域 Spring表达式语言 一.环境与profile 配置profile bean 在软件开发的时候,有一个 ...
- Spring高级装配(一) profile
Spring高级装配要学习的内容包括: Spring profile 条件化的bean声明 自动装配与歧义性 bean的作用域 Spring表达式语言 以上属于高级一点的bean装配技术,如果你没有啥 ...
- 【Java Web开发学习】Spring4条件化的bean
[Java Web开发学习]Spring4条件化的bean 转载:https://www.cnblogs.com/yangchongxing/p/9071960.html Spring4引入了@Con ...
- 002Conditional条件化创建bean
01.条件化配置bean @Bean @Conditional(MagicExistsCondition.class)---->条件化创建bean public MagicBean magicB ...
随机推荐
- 并发编程 Semaphore的使用和详解
类Semaphore的基本使用 Semaphore的作用:限制线程并发的数量 课外话题[多线程的同步概念]:其实就是排着队去执行一个任务,执行任务是一个一个的执行,这样的优点是有助于程序逻辑的正确性, ...
- Python 列表深浅复制详解
在文章<Python 数据类型>里边介绍了列表的用法,其中列表有个 copy() 方法,意思是复制一个相同的列表.例如 names = ["小明", "小红& ...
- Springboot源码分析之EnableAspectJAutoProxy
摘要: Spring Framwork的两大核心技术就是IOC和AOP,AOP在Spring的产品线中有着大量的应用.如果说反射是你通向高级的基础,那么代理就是你站稳高级的底气.AOP的本质也就是大家 ...
- 数据读写API——IO流
理清一些概念 1.Java 中的IO是干啥的? IO指的是Input和Output,主要目的是实现数据在存储介质之间的传输.[流:数据流,类比与水流的流动] 2.IO分类 按照操作单元来划分,可以分为 ...
- 分布式CAP理论
分布式CAP理论 来自wiki: 在理论计算机科学中,CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下 ...
- SSH开发模式——Struts2(第一小节)
在制定了学习计划的学习过程中,我感觉学习还是很有效率的.很短的时间内,我便学习完了JavaWeb的连接池.DbUtils框架及其一些工具类的使用. 学无止境,学习这些知识还远远不够,所以,在接下来的时 ...
- 图表控件业界革命 -Arction新产品LightningChart JS 上市
芬兰高科技企业Arction Ltd 在今年8月份推出了用于网页的数据可视化控件新解决方案—— LightningChart JS. 初次的基准测试表明,该产品为网页应用程序的数据可视化刷新了新的纪录 ...
- react antd 关于selectedRows 的问题
在table中,经常会用到单选和多选的功.这里会有一个方法, 当触发onchange的时候回有两个数组,[selectedRowKeys, selectedRows],当前选中的keys和每一项, 这 ...
- linux 如何初始化密码(解决mysql root用户登录不了的问题)
这是我遇到的问题 然后就想这可能是mysql安全模式的问题,解决思路:首先改变mysql的安全模式及密码校验问题,jinrumysql后在更改用户名密码. 1.首先将my.ini中加入在[mysqld ...
- ES6之解构
1.ES6允许按照一定的模式,从数组中和对象中提取值,对变量进行赋值,这种称为解构(Distructuring): let [a,b,c] = [3,5,6];// 相当于 a=3,b=5,c=6 本 ...