020 使用@Conditional注解完成条件注入

一 .概述

在spring之中提供@Conditional注解完成条件注入.

我们可以实现特定的接口,完成配置类可以根据条件进行Bean的创建.



二 .测试

public abstract class OS {
    protected String name;

    public String getName() {
        return this.name;
    }
}

class Windows extends OS {
    public  Windows() {
         super.name = "windows";
    }

}

class Linux extends OS {
    public Linux() {
        super.name = "linux";
    }
}

配置类:

@Configuration
public class ConditionalConfig {

    @Bean//只用条件成立才会创建对象
    @Conditional(WindowsConditonal.class)
    public OS windows() {
        return new Windows();
    }

    @Bean
    @Conditional(LinuxConditional.class)
    public OS linux() {
        return new Linux();
    }
}

两个条件类:

public class AbstractConditional {

    public String getOSName(ConditionContext context) {
        Environment environment = context.getEnvironment();
        String osName = environment.getProperty("os.name");
        return osName;
    }
}
public class WindowsConditonal extends AbstractConditional implements Condition{

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        if(super.getOSName(context).toUpperCase().contains("WINDOWS")) {
            return true;
        }
        return false;
    }

}
public class LinuxConditional  extends AbstractConditional implements Condition{

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        if(super.getOSName(context).toUpperCase().contains("LINUX")) {
            return true;
        }
        return false;
    }

}

只有当当前的操作系统为windows时,才会注入该bean.

测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes= {ConditionalConfig.class})
public class ConditionalTest {

    @Autowired
    private ApplicationContext context;

    @Test
    public void test() {
        System.out.println(context.getBean(OS.class).getName());
    }
}

结果返回为window,说明在当前的操作系统中只能创建一个Bean,另外一个Bean的声明并不会执行,否则getBean()方法会出现问题.

原文地址:https://www.cnblogs.com/trekxu/p/9094869.html

时间: 2024-10-08 23:16:55

020 使用@Conditional注解完成条件注入的相关文章

一文了解@Conditional注解说明和使用

目录 @Contidional 介绍 Condition 接口 Spring @Conditional注解实例 @Conditional 与@Profile 的对比 ? @Conditional:Spring4.0 介绍了一个新的注解@Conditional,它的逻辑语义可以作为"If-then-else-"来对bean的注册起作用. @Contidional 介绍 ? Conditional 是由 SpringFramework 提供的一个注解,位于 org.springframew

SpringBoot(15)—@Conditional注解

SpringBoot(15)-@Conditional注解 作用 @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件的才给容器注册Bean. 一.概述 1.@Conditional注解定义 @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Conditional { Clas

使用spring注解,注入sessionFactory类

简述 目前使用spring hibernate作为项目的框架,并且使用注解方式进行对象装载.在装载Dao对象的时候常常需要注入sessionFactory对象,通常的做法是Dao继承至HibernateDaoSuppor,t然后在Dao中添加setSuperSessionFactory 方法进行注入的,这几天网上又看到一种更好的方法,所以这里就把这两种方法都记录一下. 方法一(继承HibernateDaoSupport) 这个是比较常用的方法,看到很多文章中都使用这种方式. 前置条件: sess

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

@Profile注解是@Conditional注解的一个例子.即@Profile也是用@Conditional注解来实现的. 必须让条件实现Condition这个接口. 下面的案例讲如果环境中有magic这个属性,则能通过条件,spring会创建bean.反之如果环境中没有magic这个属性,则不能通过条件,spring就不会创建bean,会报错. 案例的代码如下: MagicBean的代码如下: 1 package com.advancedWiring.conditionalBeans; 2

EJB通过注解方式注入并使用其他EJB或者服务、配置JBoss数据源

通过注解方式注入并使用其他EJB或者服务 真实项目EJB对象很多,EJB之间也可以互相调用, 在项目HelloWorld下新建接口Other在cn.hqu.ejb3下: public interface Other { public abstract String sayMe(); } 新建实现类OtherBean在cn.hqu.ejb3下: public class OtherBean implements Other { @Override public String sayMe() { r

spring HibernateDaoSupport 注解属性注入的方法

/*使用注解属性注入无法调用HibernateDaoSupport中的setSessionFactory方法,需要手动创建,并且setSessionFactory不能被重写 * 需要新建方法,在新方法中调用父类的setSessionFactory方法,显式的指向属性名称*/ @Resource(name="sessionFactory") private void setSF(SessionFactory sessionFactory) { setSessionFactory(sess

Spring中的@conditional注解

今天主要从以下几方面来介绍一下@Conditional注解 @Conditional注解是什么 @Conditional注解怎么使用 1,@Conditional注解是什么 @Conditional注解是可以根据一些自定义的条件动态的选择是否加载该bean到springIOC容器中去,如果看过springBoot源码的同学会发现,springBoot中大量使用了该注解 2,@Conditional注解怎么使用 查看@Conditional源码你会发现它既可以作用在方法上,同时也可以作用在类上,源

android使用篇(四) 注解依赖注入IOC实现绑定控件

在android使用篇(三) MVC模式中提到一个问题: 1) 视图层(View):一般採用XML文件进行界面的描写叙述,使用的时候能够很方便的引入,可是用xml编写了,又须要在Acitvity声明而且实例化,有点麻烦,考虑是否能做一个类似注解实现匹配,或者写一个类获取xml的各个节点然后自己主动进行封装,当然,这仅仅是个想法,以后再实现. 今天最终把这个想法实现了,使用依赖注入IOC注解实现对activity中控件的实例化. 先普及一下java的反射机制和注解机制的知识: 下面引用大神的两篇文

Spring3中用注解直接注入properties中的值

在bean(可是controller, service, dao等了)中,使用@Value注解: @Service public class TestService{ @Value("${sytem.username}") String loginUserName; } 在spring中定义资源文件: <context:property-placeholder />或者org.springframework.beans.factory.config.PropertyPlac