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

2025-05-29 0 84

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

  • spring的jdbctemplate是不是在classpath里面?如果是,并且datasource也存在,就自动配置一个jdbctemplate的bean
  • thymeleaf是不是在classpath里面?如果是,则自动配置thymeleaf的模板解析器、视图解析器、模板引擎

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

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

一、@conditional小例子

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

1.判断条件定义

1.)windows下的判定条件

?

1

2

3

4

5

6

7

8

9

10
/**

* 实现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下的判定条件

?

1

2

3

4

5

6

7

8

9

10
/**

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

*

*/

public class linuxcondition implements condition{

@override

public boolean matches(conditioncontext context, annotatedtypemetadata metadata) {

return context.getenvironment().getproperty("os.name").contains("linux");

}

}

2.不同系统下的bean的类

1.)接口

?

1

2

3
public interface listservice {

public string showlistline();

}

2.)windows下的bean类

?

1

2

3

4

5

6
public class windowslistservice implements listservice{

@override

public string showlistline() {

return "dir";

}

}

3.)linux下的bean的类

?

1

2

3

4

5

6
public class linuxlistservice implements listservice{

@override

public string showlistline() {

return "ls";

}

}

3.配置类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21
@configuration

public class conditionconfig {

/**

* 通过@conditional 注解,符合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.测试类

?

1

2

3

4

5

6

7

8
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包

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

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

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

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

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

?

1

2

3

4

5

6
@bean

@primary

@conditionalonmissingbean(jdbcoperations.class)

public jdbctemplate jdbctemplate() {

return new jdbctemplate(this.datasource);

}

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

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

总结

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

原文链接:http://www.cnblogs.com/sam-uncle/p/9104256.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Spring boot中@Conditional和spring boot的自动配置实例详解 https://www.kuaiidc.com/111902.html

相关文章

发表评论
暂无评论