Spring Boot条件注解 - 第400篇

一、JdbcTemplate

         JdbcTemplate是我们在操作DAO,很重要的一个类,我们在Spring Boot中添加如下依赖:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-jdbc</artifactId>
  4. </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才会生效

  1. @Component
  2. @ConditionalOnBean(name="redisTemplate")
  3. public class RedisOperBean {
  4. private final RedisTemplate redisTemplate;
  5. public RedisOperBean(RedisTemplate redisTemplate) {
  6. // ...
  7. }
  8. }

这样的好处就是我提供的这个第三方包,如果被用户A间接依赖(但是A本身不需要操作redis),也不会因为创建RedisOperBean而抛异常。

产生异常的原因是因为找不到RestTemplate的bean,因此无法实例化RedisOperBean,从而抛出异常。

购买完整视频,请前往:http://www.mark-to-win.com/TeacherV2.html?id=287