Spring4提供了一个通用的基于特定条件创建Bean的方式:@Conditional注解。条件注解是根据特定的条件来选择Bean对象的创建。如果你想一个或多个Bean只有在应用的路径下包含特定的库时才创建,那么使用这个注解定义条件化的Bean就再适合不过了。
使用示例:
1、在Springboot工程的application.yml文件中添加配置内容:
magicCondition: true2、创建MagicCondition类,实现org.springframework.context.annotation.Condition接口,重新实现父类的matches方法:
import org.springframework.context.annotation.Condition; import org.springframework.context.annotation.ConditionContext; import org.springframework.core.env.Environment; import org.springframework.core.type.AnnotatedTypeMetadata; public class MagicCondition implements Condition { /** * 实现matches方法,如果返回true就创建该Bean,如果返回false则不创建该Bean。 * @param context * @param metadata * @return */ @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { Environment env = context.getEnvironment(); if(env.containsProperty("magicCondition")){ // 检查application.xml配置文件中是否存在magicCondition属性key String magicCondition = env.getProperty("magicCondition");// 获取属性的值 return "true".equals(magicCodition); // 返回属性的值是否为true } return false; // 返回false } }3、写demo用的service
public interface MagicService { String getInfo(); }
import com.wltjack.service.MagicService; public class MagicServiceImpl implements MagicService { @Override public String getInfo() { return "MagicServiceImpl >>> getInfo() run..."; } }4、创建MagicConditionConfig配置类
import com.wltjack.common.MagicCondition; import com.wltjack.service.impl.MagicServiceImpl; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; /** * MagicConditionConfig配置类,当Spring容器中存在MagicCondition Bean对象,并满足MagicCondition类的条件时,才去实例化magicService这个Bean。 */ @Configuration @ComponentScan(basePackages = {"com.wltjack"}) public class MagicConditionConfig { @Bean @Conditional(MagicCondition.class) // 指定条件类 public MagicServiceImpl magicService(){ return new MagicServiceImpl(); } }@Conditional(MagicCondition.class) :指定条件类MagicCondition,当其matches方法返回true时才执行magicService方法实例化Bean。
5、创建MagicConditionController类,提供url访问入口:
import com.wltjack.common.SpringContextUtils; import com.wltjack.service.MagicService; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/magic/condition") public class MagicConditionController { @GetMapping("/info") public String info(){ try { MagicService ms = (MagicService) SpringContextUtils.getApplicationContext().getBean("magicService"); // 从Spring容器中获取magicService bean return ms.getInfo(); }catch (Exception e){ e.printStackTrace(); } return "null"; } }其中,SpringContextUtils类提供了应用上下文的注入与获取,代码如下:
import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; @Component public class SpringContextUtils implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { if(SpringContextUtils.applicationContext == null){ SpringContextUtils.applicationContext = applicationContext; } System.out.println("========ApplicationContext配置成功,在普通类可以通过调用SpringContextUtils.getApplicationContext()获取applicationContext对象,applicationContext="+SpringContextUtils.applicationContext+"========"); } public static ApplicationContext getApplicationContext() { return applicationContext; } }
代码写完后,开始测试:
首先,将application.yml配置文件中的magicCondition值为true,启动应用,访问url:
可以看页面输出信息:
然后,将application.yml配置文件中的magicCondition值为false,重启应用,访问url:
可以看页面输出信息:
页面上已经不能输出serviceImpl方法中返回的文本,看到控制台已经出现如下错误信息:
从错误提示中,我们可以看到magicService并没有实例化到Spring容器中。
最后,我们打开org.springframework.context.annotation.Condition类的类层次结构图,可以看到实现该接口的类:
其中,SpringBootCondition类为Spring Boot中使用的所有条件实现的基础。
相关推荐
在Spring Boot框架中,`@Conditional`注解是条件装配的核心工具,它允许我们基于某些条件来决定是否加载或注册一个Bean。这个功能使得我们能够更精细化地控制应用的配置,仅在满足特定条件时才会激活某个Bean。下面...
SpringBoot 中的 @Conditional 注解使用详解 @Conditional 注解是 Spring 4.0 之后出的一个非常有用的注解,主要用于根据具体的条件决定是否创建 Bean 到 Spring 容器中。下面我们来详细介绍 @Conditional 注解的...
在Spring Boot框架中,`@Conditional`注解是条件化注解的核心,它允许你在创建Bean时设置特定的条件。当这些条件满足时,Bean才会被Spring容器注册并实例化。这一特性使得开发者可以根据应用程序的具体环境和配置...
Spring 4.0 引入了@Conditional注解,它提供了一种更加灵活的方式来决定何时实例化一个对象,根据特定的条件。这个功能使得我们能够更精细化地控制Spring容器中的bean装配,仅在满足特定条件时才创建和注册bean。 ...
3. **自动配置**:SpringBoot通过`@Conditional`注解和对应的条件类实现自动配置。例如,如果你引入了`spring-boot-starter-data-jpa`,SpringBoot会自动配置JPA和数据源。 4. **控制器**:使用`@RestController`...
条件注解@Conditional 组合注解与元注解 @Enable*注解的工作原理 直接导入配置类 依据条件选择配置类 动态注册Bean 测试 Spring TestContext Framework集成测试 SpringMVC基础 Spring MVC...
此外,SpringBoot还使用`@Conditional`系列注解来控制Bean的创建条件,如`@ConditionalOnClass`和`@ConditionalOnProperty`等,这些注解使得配置更加灵活和精确。 在`july-springboot`这个目录中,我们可以找到具体...
3. **自动配置(Auto Configuration)**:SpringBoot 通过扫描类路径和 @Conditional 注解,自动配置相关 Bean。例如,当发现 MySQL 驱动在类路径上时,它会自动配置数据库连接。 4. **Actuator**:SpringBoot ...
SpringBoot使用`@Conditional`注解实现条件化配置,例如`@ConditionalOnClass`和`@ConditionalOnProperty`。如果满足条件,对应的配置就会生效。例如,如果项目中有`Jackson`库,那么`JacksonAutoConfiguration`就...
自定义@Conditional 注释示例什么是@Conditional 是添加到 Spring 4 的注解,用于指定处理特定配置或将特定 bean 注册到 Spring 上下文的条件。为什么重要Spring Boot 项目自动配置支持依赖于 @Conditional - 它有...
这一节将深入讲解如何利用@EnableAutoConfiguration注解来启用自动配置,以及@Conditional注解的作用。 5. **依赖管理**: "006、SpringBoot3-细节分析-依赖管理机制.mp4" - 在Spring Boot中,依赖管理简化了Maven或...
课程内容以时下最新的技术点为主线,逐步的进行展开,分别细化的讲解了SpringBoot2基础课程,SpringBoot2底层注解,SpringBoot2自动化配置,SpringBoot2请求处理,SpringBoot2高级特性和原理分析,是不可错过的...
SpringBoot 框架提供了强大的依赖注入机制,通过使用 @Conditional 注解可以根据条件切换注入不同实现类。下面将详细介绍 SpringBoot 实现根据条件切换注入不同实现类的示例代码。 使用 @Conditional 注解 @...
当我们谈到SpringBoot的源码时,不得不提到条件注解(Conditional Annotation)和自动配置(Auto Configuration)。例如,`@ConditionalOnClass`和`@ConditionalOnProperty`注解让SpringBoot可以根据类路径是否存在...
Spring Boot还提供了一个注解@SpringBootApplication,它实际上是一个复合注解,包含@ComponentScan(包扫描)和@EnableAutoConfiguration(开启自动装配)。 自动装配的原理还与Spring的条件化装配有关,即@...
4. `Condition`和`@Conditional`:SpringBoot的条件注解机制,允许Bean的创建基于某些条件,例如类路径中是否存在某个文件或类。 四、源码学习的重要性 理解SpringBoot源码有助于开发者深入掌握其内部工作机制,...
3. 自动配置:基于条件注解(@Conditional)来决定哪些组件应该在特定条件下被启用。例如,如果检测到JDBC驱动,就会自动配置DataSource。 四、快速入门 1. 创建项目:使用Spring Initializr在线生成一个基础的...
Spring Boot conditional 注解用法详解 Spring Boot conditional 注解是 Spring Boot 框架中的一种重要机制,它允许开发者根据特定的条件来决定是否创建某个 Bean,这种机制可以极大地提高应用程序的灵活性和可维护...