下面我将为您详细讲解“Spring Boot 自动配置之条件注解浅析”的完整攻略,包含两条示例说明。
1. Spring Boot自动配置原理
Spring Boot的自动配置原理是通过条件注解来实现的。Spring Boot启动时,会默认扫描项目中所有的@Configuration注解,然后根据条件注解(@ConditionalOnXxx)来判断该配置是否需要生效。
例如,一个@Configuration注解的类中如果有@ConditionalOnClass注解,则表示只有当项目中存在指定的类时,该@Configuration才会生效。@ConditionalOnClass注解的实现如下:
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(OnClassCondition.class)
public @interface ConditionalOnClass {
/**
* The classes that must be present. Since this annotation is parsed by loading class
* bytecode, it is safe to specify classes here that may ultimately not be on the classpath,
* although doing so will generally not be useful unless the intention is to test for the
* presence of a class and fail fast when it is not available.
* @return the classes that must be present
*/
Class<?>[] value() default {};
}
2. 示例一:条件注解@ConditionalOnWebApplication
条件注解@ConditionalOnWebApplication表示只有当项目是一个Web应用时,该@Configuration才会生效。@ConditionalOnWebApplication注解的实现如下:
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(OnWebApplicationCondition.class)
public @interface ConditionalOnWebApplication {
/**
* The type of web application to check for.
* @return the required type of web application
*/
WebApplicationType type() default WebApplicationType.SERVLET;
}
我们可以通过以下步骤来演示它的使用:
步骤一:创建一个Spring Boot的Maven项目,命名为“web-demo”;
步骤二:添加如下依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
这里我们添加了spring-boot-starter-web依赖,用于启动一个Web应用。
步骤三:创建一个@Configuration注解的类,并在该类上添加@ConditionalOnWebApplication注解。代码如下:
@Configuration
@ConditionalOnWebApplication
public class MyConfig {
@Bean
public String myBean() {
return "Hello, World!";
}
}
步骤四:创建一个SpringBootApplication,启动应用并访问http://localhost:8080,会看到如下结果:
Hello, World!
这说明我们的@Configuration生效了,因为项目是一个Web应用。
3. 示例二:条件注解@ConditionalOnMissingBean
条件注解@ConditionalOnMissingBean表示只有当指定的Bean不存在时,该@Configuration才会生效。@ConditionalOnMissingBean注解的实现如下:
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(OnMissingBeanCondition.class)
public @interface ConditionalOnMissingBean {
/**
* The class of bean that should not be present.
* @return the class of bean that should not be present
*/
Class<?>[] value() default {};
}
我们可以通过以下步骤来演示它的使用:
步骤一:创建一个Spring Boot的Maven项目,命名为“bean-demo”;
步骤二:添加如下依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
这里我们添加了spring-boot-starter-web依赖,用于启动一个Web应用。
步骤三:创建一个@Service注解的类,命名为MyService。代码如下:
@Service
public class MyService {
public void run() {
System.out.println("My Service is running...");
}
}
步骤四:创建一个@Configuration注解的类,命名为MyConfig,并在该类上添加@ConditionalOnMissingBean注解。代码如下:
@Configuration
public class MyConfig {
@Bean
@ConditionalOnMissingBean(MyService.class)
public String myBean() {
return "Hello, World!";
}
}
步骤五:创建一个SpringBootApplication,启动应用并访问http://localhost:8080,会看到如下结果:
Hello, World!
步骤六:将MyService改为如下代码:
@Service
public class MyService {
public void run() {
System.out.println("My Service is running...");
}
}
步骤七:重新启动应用并访问http://localhost:8080,会看到如下结果:
My Service is running...
这说明@Configuration不生效了,因为我们的MyService存在了,条件不满足。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot 自动配置之条件注解浅析 - Python技术站