002Conditional条件化创建bean

01、条件化配置bean

@Bean
@Conditional(MagicExistsCondition.class)---->条件化创建bean
public MagicBean magicBean(){
    return new MagicBean();
}

02、条件接口

public interface Condition{
    boolean matches(ConditionContext ctxt, AnnotatedTypeMetadata metadata);
}

03、条件类实现

public class MagicExistsCondition implement Condition {
    public boolean matches( ConditionContext context, AnnotatedTypeMetadata metadata){
        Environment env = context.getEnvironment();
        return env.containsProperty("magic");    ---->检查magic属性
    }
}

04、ConditionContext接口

public interface ConditionContext{
    BeanDefinitionRegistry getRegistry();    ---->检查bean定义
    ConfigurableListableBeanFactory getBeanFactory();    ---->检查bean是否存在,并探查bean的属性
    Environment getEnvironment();    ---->检查环境变量是否存在,及其值是什么
    ResourceLoader getResourceLoader();    ---->探查加载的资源
    ClassLoader getClassLoader();    ---->加载并检查类是否存在
}

05、AnnotatedTypeMetadata接口

public interface AnnotatedTypeMetadata{
    boolean isAnnotated(String annotationType);    ---->判断带@bean的注解,是否还带其它注解
    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);
}

06、举例:Profile注解的实现

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@Conditional(ProfileCondition.class)
public @interface Profile{
    String [] value();
}

class ProfileCondition implements Condition {
    public boolean matches(ConditionContext context, AnnotatedTypeMethodMetadata metadata){
        if(context.getEnvironment() != null){
            MultiValueMap<String, Object> attrs = metadata.getAllAnnotationAttributes(Profile.calss.getName());
            if(attrs != null){
                for(Object value : attrs.get("value")){
                    if(context.getEnvironment().acceptsProfiles((String[]) value)){
                        return true;
                    }
                }
                return false;---->没有激活,则不创建bean
            }
        }
        return true;
    }
}
时间: 2024-10-28 05:43:37

002Conditional条件化创建bean的相关文章

001profile条件化创建bean

01.类级别条件创建 @Configuration @Profile("dev") public class Aclass{}---->影响整个类,包括类的注解.开发环境,类中的配置才生效 02.方法级别条件创建 @Configuration poublic class AClass{ @Bean @Profile("dev")---->与@Bean一起使用,仅仅影响整个方法 public DataSource createDataSource(){ .

Spring 实战-第三章-条件化的bean

在使用的时候,某些bean需要在某些特定条件化才能实例化,spring中使用的@Condition注解实现这个功能. 1.接口 package main.java.soundsystem; public interface CompactDisc { void play(); } 2.实现 package main.java.soundsystem; import org.springframework.context.annotation.Conditional; import org.spr

Spring高级装配(二) 条件化的bean

如果你希望一个bean在特定的条件下才会出现: 应用的类路径下包含特定的库时才创建 只有当某个特定的bean也声明之后才会创建 某个特定的环境变量设定之后才创建某个bean 在Spring 4之前,很难实现这种级别的条件化配置,但是Spring4引入了一个新的@Conditional注解,它可以用到带有@Bean注解的方法上.如果给定的条件计算结果为true,就会创建这个bean,否则的话,这个bean会被忽略. 示例:设置了magic环境属性才去实例化MagicBean 1 @Bean 2 @

条件化bean

天行健,君子以自强不息.--<周易> 应用场景 假设你希望一个或多个bean只有在应用的类路径下包含特定的库时才创建,希望某个bean只有当某个特定的bean也声明了之后才会创建,或者只有某个特定的环境变量设置之后才会创建bean.Spring 4 引入了@Conditional注解,它可以用到带有@Bean注解的方法上,如果给定的条件满足才会创建bean,反之则会被忽略. 条件化配置bean的代码如下: package chapter3; import org.springframework

Spring In [email&#160;protected]条件化Bean

@Conditional根据某个条件来决定是否创建Bean实例 代码下载地址:http://download.csdn.net/download/poiuy1991719/9965794 创建一个Bean类: package com.bean.conditional; import org.springframework.context.annotation.Conditional; import org.springframework.stereotype.Component; @Compon

Springboot学习笔记(五)-条件化注入

前言 将Bean交给spring托管很简单,根据功能在类上添加@Component,@Service,@Controller等等都行,如果是第三方类,也可以通过标有@Configuration的配置类来进行注入.但并不是所有被注入的bean都用得着,无脑注入会浪费资源.springboot提供了条件化配置,只有在满足注入条件才实例化.比如自定义一个ServiceHelloService,希望在spring.profiles.active=local时才加载. 基础 springboot中提供了C

SSH(Struts2+Spring+Hibernate)框架搭建流程&lt;注解的方式创建Bean&gt;

此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password. SSH,xml方式搭建文章链接地址:http://www.cnblogs.com/wkrbky/p/5912810.html 一.Hibernate(数据层)的搭建: 实现流程 二.Spring(注入实例)的使用: 实现流程 三.Struts2(MVC)的搭建: 实现流程 这里注意一点问题: Struts2与Hibernate在一起搭建,antlr包,有冲突.MyE

使用反射创建Bean、Spring中是如何根据类名配置创建Bean实例、Java提供了Class类获取类别的字段和方法,包括构造方法

Java提供了Class类,可以通过编程方式获取类别的字段和方法,包括构造方法 获取Class类实例的方法: 类名.class 实例名.getClass() Class.forName(className) public class RefTest { @Test public void testRef(){ //Class cls = RefTest.class; //Class.forName("com.jboa.service.RefTest"); //new RefTest()

Spring基础(3) : 静态工厂和实例工厂创建bean

public class Factory { public static Person staticCreate(){ Person p = new Person(); p.name="staticCreate"; return p; } public Person instanceCreate(){ Person p = new Person(); p.name="instanceCreate"; return p; } } public static void