Spring Boot条件注解 - 第400篇
一、JdbcTemplate
JdbcTemplate是我们在操作DAO,很重要的一个类,我们在Spring Boot中添加如下依赖:
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-jdbc</artifactId>
- </dependency>
当我们添加了此依赖之后,并不需要进行什么配置就可以使用JdbcTemplate了。这就是Spring Boot进行的相应的一个配置,核心的配置类JdbcTemplateAutoConfiguration:
这个类上面有注解@Configuration和@Import的注解:
(1)@Configuration:标记JdbcTemplateAutoConfiguration是配置类。
(2)@Import导入其它的类。
具体的这个使用,可以看之前的文章《Spring Boot注解@Import小试牛刀 - 第360篇》
Spring Boot注解@Import小试牛刀 - 第360篇
@Configuration
@Configuration标记了JdbcTemplateAutoConfiguration类,那么此类就会被扫描到,那么这个类具体会不会被处理是有条件的,那么就是类上的条件注解了。
(1)@ConditionalOnClass({ DataSource.class, JdbcTemplate.class }):需要能够找到类DataSource和JdbcTemplate
(2)@ConditionalOnSingleCandidate(DataSource.class):Spring当前或父容器中必须存在DataSource这个类型的实例,且只有一个实例
@Import
@Import({ JdbcTemplateConfiguration.class, NamedParameterJdbcTemplateConfiguration.class })
中的@Import会注入JdbcTemplateConfiguration和NamedParameterJdbcTemplateConfiguration,我们看下其中的一个:JdbcTemplateConfiguration,根据这个代码可以看到:
我们会看到在这里注入了JdbcTemplate。
二、其它一些小栗子说明
@ConditionalOnBean(javax.sql.DataSource.class)
Spring容器或者所有父容器中需要存在至少一个javax.sql.DataSource类的实例
@ConditionalOnClass({ Configuration.class,FreeMarkerConfigurationFactory.class })
类加载器中必须存在Configuration和FreeMarkerConfigurationFactory这两个类
@ConditionalOnExpression(“’${server.host}’==’localhost’”)
server.host配置项的值需要是localhost
@ConditionalOnJava(JavaVersion.EIGHT)
Java版本至少是8
@ConditionalOnMissingBean(value = ErrorController.class, search = SearchStrategy.CURRENT)
Spring当前容器中不存在ErrorController类型的bean
@ConditionalOnMissingClass(“GenericObjectPool”)
类加载器中不能存在GenericObjectPool这个类
@ConditionalOnNotWebApplication
必须在非Web应用下才会生效
@ConditionalOnProperty(prefix = “spring.aop”, name = “auto”, havingValue = “true”, matchIfMissing = true)
应用程序的环境中必须有spring.aop.auto这项配置,且它的值是true或者环境中不存在spring.aop.auto配置(matchIfMissing为true)
@ConditionalOnResource(resources=”mybatis.xml”)
类加载路径中必须存在mybatis.xml文件
@ConditionalOnSingleCandidate(PlatformTransactionManager.class)
Spring当前或父容器中必须存在PlatformTransactionManager这个类型的实例,且只有一个实例
@ConditionalOnWebApplication
必须在Web应用下才会生效
三、我们要怎么使用?
这里我们举个小栗子说明下:
@ConditionalOnBean
要求bean存在时,才会创建这个bean;如我提供了一个bean名为RedisOperBean,用于封装redis相关的操作;但是我这个bean需要依赖restTemplate这个bean,只有当应用引入了redis的相关依赖,并存在RestTemplate这个bean的时候,我这个bean才会生效
- @Component
- @ConditionalOnBean(name="redisTemplate")
- public class RedisOperBean {
- private final RedisTemplate redisTemplate;
- public RedisOperBean(RedisTemplate redisTemplate) {
- // ...
- }
- }
这样的好处就是我提供的这个第三方包,如果被用户A间接依赖(但是A本身不需要操作redis),也不会因为创建RedisOperBean而抛异常。
产生异常的原因是因为找不到RestTemplate的bean,因此无法实例化RedisOperBean,从而抛出异常。
购买完整视频,请前往:http://www.mark-to-win.com/TeacherV2.html?id=287