spring in action学习笔记七:@Conditional注解的用法

@Profile注解是@Conditional注解的一个例子。即@Profile也是用@Conditional注解来实现的。

必须让条件实现Condition这个接口。

下面的案例讲如果环境中有magic这个属性,则能通过条件,spring会创建bean。反之如果环境中没有magic这个属性,则不能通过条件,spring就不会创建bean,会报错。

案例的代码如下:

MagicBean的代码如下:

 1 package com.advancedWiring.conditionalBeans;
 2
 3 import org.springframework.beans.factory.BeanNameAware;
 4 import org.springframework.beans.factory.annotation.Value;
 5
 6 /**
 7  * Created by ${秦林森} on 2017/6/8.
 8  */
 9 public class MagicBean implements BeanNameAware{
10
11     @Override
12     public void setBeanName(String name) {
13         System.out.println("The MagicBean‘s bean name is :"+name);
14     }
15 }

MagicExistsCondition的代码如下:

 1 package com.advancedWiring.conditionalBeans;
 2
 3 import org.springframework.context.annotation.Condition;
 4 import org.springframework.context.annotation.ConditionContext;
 5 import org.springframework.core.env.Environment;
 6 import org.springframework.core.type.AnnotatedTypeMetadata;
 7
 8 /**
 9  * Created by ${秦林森} on 2017/6/8.
10  */
11 public class MagicExistsCondition implements Condition{
12     @Override
13     public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
14         Environment environment = context.getEnvironment();
15         /**
16          * 如果环境包含magic这个属性,则返回true,反之为false
17          * 千万不要理解为MagicBean有magic这个属性返回true,反之为false.
18          */
19         return environment.containsProperty("magic");
20      }
21 }

MapelConfig的代码如下:

 1 package com.advancedWiring.conditionalBeans;
 2
 3 import org.springframework.context.annotation.Bean;
 4 import org.springframework.context.annotation.Conditional;
 5 import org.springframework.context.annotation.Configuration;
 6 import org.springframework.context.annotation.Import;
 7
 8 /**
 9  * Created by ${秦林森} on 2017/6/8.
10  */
11 @Configuration
12 public class MapelConfig {
13     @Bean
14     @Conditional(MagicExistsCondition.class)
15     public MagicBean magicBean(){
16         return  new MagicBean();
17     }
18 }

测试类Test的代码如下:

 1 package com.advancedWiring.conditionalBeans;
 2
 3 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 4
 5 /**
 6  * Created by ${秦林森} on 2017/6/8.
 7  */
 8 public class Test {
 9     public static void main(String[] args) {
10         /**
11          * 如果想让MagicExistsCondition返回true的话:
12          *  System.setProperty("magic","这里的内容随便写");这句话不能少。
13          *  反之,如果不写上面的语句,则返回false.
14          */
15         System.setProperty("magic","people");//这句话不能少。
16         AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(MapelConfig.class);
17         MagicBean magicBean = ac.getBean(MagicBean.class);
18     }
19 }
时间: 2024-08-06 22:20:29

spring in action学习笔记七:@Conditional注解的用法的相关文章

spring in action学习笔记十五:配置DispatcherServlet和ContextLoaderListener的几种方式。

在spring in action中论述了:DispatcherServlet和ContextLoaderListener的关系,简言之就是DispatcherServlet是用于加载web层的组件的上下文.ContextLoadListener是加载 其他组件的上下文. 第一种方式:纯注解的方式: 在spring4.0版本以上,倾向用注解的方式配置DispatcherServlet和ContextLoaderListener.配置方式如下: 思路:一个类只要继承AbstractAnnotati

spring in action学习笔记一:DI(Dependency Injection)依赖注入之CI(Constructor Injection)构造器注入

一:这里先说一下DI(Dependency Injection)依赖注入有种表现形式:一种是CI(Constructor Injection)构造方法注入,另一种是SI(Set Injection) set 注入.这篇随笔讲的是第一种构造方法注入(Constructor Injection). 其实DI(Dependency Injection)依赖注入你不妨反过来读:注入依赖也就是把"依赖"注入到一个对象中去.那么何为"依赖"呢?依赖就是讲一个对象初始化或者将实例

spring in action学习笔记十六:配置数据源的几种方式

第一种方式:JNDI的方式. 用xml配置的方式的代码如下: 1 <jee:jndi-lookup jndi-name="/jdbc/spittrDS" resource-ref="true" id="dataSource"/> 用注解方式的代码如下: 1 @Bean 2 public JndiObjectFactoryBean jndiObjectFactoryBean(){ 3 JndiObjectFactoryBean jndi

Spring in Action 学习笔记二-DI

装配bean 2015年10月9日 9:49 ? ? ? ? ? ? Sprng中,对象无需自己负责查找或创建其关联的其他对象.相关,容器负责吧需要相互协作的对象引用赋予各个对象. 创建应用对象之间协作关系的行为通常被称为装配(wiring).这是依赖注入的本质. ? ? ? ? ? ? 声明bean ? ? ? 典型的xml配置文件 ? ? ? ? ? ? 屏幕剪辑的捕获时间: 2015-10-9 10:17 ? ? ? spring核心自带了10个命令空间 ? ? ? ? ? ? 屏幕剪辑的

Spring in Action 学习笔记一

Spring 核心 ? ? ? Spring的主要特性仅仅是 依赖注入DI和面向切面编程AOP ? ? ? JavaBean 1996.12 Javav 规范针对Java定义了软件组件模型,是简单的Java对象不仅可以重用,而且可以轻松的构建更复杂的应用.没有提供诸如事务支持.安全.分布式计算等服务. ? ? ? BJB 1998.3 提供了必须的企业级服务,但是不再简单, 声明式编程简化开发 部署描述符和配套代码实现异常复杂. Java 组件开发, AOP 和DI 为POJO提供了类似EJB的

Spring in Action 学习笔记三-AOP

面向切面的Spring 2015年10月9日 11:30 ? ? ? ? ? ? 屏幕剪辑的捕获时间: 2015-10-9 14:30 ? ? ? ? ? ? 屏幕剪辑的捕获时间: 2015-10-9 14:38 ? ? ? ? ? ? 屏幕剪辑的捕获时间: 2015-10-9 14:38 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 屏幕剪辑的捕获时间: 2015-10-10 14:42 ? ? ? ? ? ? ? ? ? 屏幕剪辑的捕获时间: 2015-10-10 14:43

spring in action 学习笔记十三:SpEL语言(Spring Expression Language)

SpEl语言的目的之一是防止注入外部属性的代码硬代码化.如@Value("#{student.name}")这个注解的意思是把Student类的name的属性值注入进去.其中student指向Student,是Student的id. SpEl的作用是: 1.The ability to reference beans by their IDs; 2.Invoking methods and accessing propeerties on objects 3.Mathmatical,r

spring in action 学习笔记八:用@Primary 或者@Qualifier消除@Autowired引起的歧义现象

首先解释一下@Primary和@Qualifier这两个注解的意思:@Primary的意思是在众多相同的bean中,优先使用用@Primary注解的bean.而@Qualifier这个注解则指定某个bean有没有资格进行注入. 示例代码的思路是:1.一个接口Dessert和这个接口的三个实现类,2.再在一个类(AbrahamLincoln)中自动注入Dessert这个接口,3.用自动扫描机制自动创建bean. 如果不用@Primary和@Qualifier注解,势必出现如下错误:NoUnique

spring in action 学习笔记九:如何证明在scope为prototype时每次创建的对象不同。

spring 中scope的值有四个:分别是:singleton.prototype.session.request.其中session和request是在web应用中的. 下面证明当scope为prototype时每次创建的对象是不同的. 示例代码如下: 1 package com.advancedWiring.ambiguityIniAutowiring2; 2 3 import org.springframework.beans.factory.BeanNameAware; 4 impor