Spring boot中@Conditional和spring boot的自动配置实例详解

网友投稿 247 2023-01-30


Spring boot中@Conditional和spring boot的自动配置实例详解

我们知道,spring boot自动配置功能可以根据不同情况来决定spring配置应该用哪个,不应该用哪个,举个例子:

Spring的JdbcTemplate是不是在Classpath里面?如果是,并且DataSource也存在,就自动配置一个JdbcTemplate的Bean

Thymeleaf是不是在Classpath里面?如果是,则自动配置Thymeleaf的模板解析器、视图解析器、模板引擎

那个这个是怎么实现的呢?原因就在于它利用了Spring的条件化配置,条件化配置允许配置存在于应用中,但是在满足某些特定条件前会忽略这些配置。

要实现条件化配置我们要用到@Conditional条件化注解。接下来写个小例子来感受下@Conditional是怎么工作的。

一、@Conditional小例子

我们知道在windows下显示列表的命令是dir,而在linux系统下显示列表的命令是ls,基于条件配置,我们可以实现在不同的操作系统下返回不同的值。

1.判断条件定义

1.)windows下的判定条件

/**

* 实现spring 的Condition接口,并且重写matches()方法,如果操作系统是windows就返回true

*

*/

public class WindowsCondition implements Condition{

@Override

public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {

return context.getEnvironment().getProperty("os.name").contains("Windows");

}

}

2.)linux下的判定条件

/**

* 实现spring 的Condition接口,并且重写matches()方法,如果操作系统是linux就返回true

*

*/

public class LinuxCondition implements Condition{

@Override

public boolean matches(ConditionContehttp://xt context, AnnotatedTypeMetadata metadata) {

return context.getEnvironment().getProperty("os.name").contains("Linux");

}

}

2.不同系统下的Bean的类

1.)接口

public interface ListService {

public String showListLine();

}

2.)windows下的Bean类

public class WindowsListService implements ListService{

@Override

public String showListLine() {

return "dir";

}

}

3.)linux下的Bean的类

public class LinuxListService implements ListService{

@Override

public String showListLine() {

return "ls";

}

}

3.配置类

@Configuration

public class ConditionConfig {

/**

* 通过@ConditionkYEZJvQnal 注解,符合windows条件就返回WindowsListService实例

*

*/

@Bean

@Conditional(WindowsCondition.class)

public ListService windonwsListService() {

return new WindowsListService();

}

/**

* 通过@Conditional 注解,符合linux条件就返回LinuxListService实例

*

*/

@Bean

@Conditional(LinuxCondition.class)

public ListService linuxListService() {

return new LinuxListService();

}

}

4.测试类

public class ConditionTest {

public static void main(String[] args) {

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConditionConfig.class);

ListService listService = context.getBean(ListService.class);

System.out

.println(context.getEnvironment().getProperty("os.name") + " 系统下的列表命令为: " + listService.showListLine());

}

}

5.运行测试类,由于我的是windows7 系统,因此结果是

Windows 7 系统下的列表命令为: dir

如果你的是linux系统,则结果就会是

Linux 系统下的列表命令为: ls

二、spring boot 的条件化配置

在spring boot项目中会存在一个名为spring-boot-autoconfigure的jar包

条件化配置就是在这个jar里面实现的,它用到了如下的条件化注解,这些注解都是以@Conditional开头的:

接下来我们看个源码的列子:

以JdbcTemplateAutoConfiguration为例,它里面有这段代码:

@Bean

@Primary

@ConditionalOnMissingBean(JdbcOperations.class)

public JdbcTemplate jdbcTemplate() {

return new JdbcTemplate(this.dataSource);

}

只有在不存在JdbcOperations(如果查看JdbcTemplate的源码,你会发现JdbcTemplate类实现了JdbcOperations接口)实例的时候,才会初始化一个JdbcTemplate 的Bean。

基于以上内容,我们就可以阅读自动配置相关的源码了。

总结

以上所述是给大家介绍的Spring boot中@Conditional和spring boot的自动配置,希望对大家有所帮助,如果大家有任何疑问请给我留言,会及时回复大家的。在此也非常感谢大家对我们网站的支持!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:浅谈React的最大亮点之虚拟DOM
下一篇:Spring Boot Web应用程序配置详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~