springboot注解
在这篇文章中,我们将探究Spring引导注解。我们将讨论基本的Springboot注解。
springboot注解
springboot附带了自动配置特性,这使得构建基于Spring的企业应用程序更加容易。让我们来介绍一些在springboot框架中可用的最重要的注解。
1
@SpringBootApplication
这是从springboot的最重要和最核心的注解之一。我们使用这个注解来标记我们的springboot应用程序的Main类。
@SpringBootApplication public class SpringOrderAnnotationApplication { public static void main(String[] args) { SpringApplication.run(SpringOrderAnnotationApplication.class, args); } }
@SpringBootApplication是一个方便的注解,它等价于使用@Configuration、@EnableAutoConfigurationand和@ComponentScan默认属性的组合注解。 你也可以单独使用@Configuration、@EnableAutoConfiguration和@ComponentScan,但是建议使用@SpringBootApplication注解。
2
@EnableAutoConfiguration
@EnableAutoConfiguration注解是springboot提供的智能配置系统。顾名思义,springboot系统尝试猜测和配置你可能需要的bean。自动配置类通常基于你的类路径和你定义的bean。 自动配置是智能的,当您定义更多自己的配置时,将自动返回。
@Configuration @EnableAutoConfiguration public class CarConfig {}
3
@Condition注解
springboot提供了创建自定义自动配置的选项。在编写这些自定义自动配置时,我们希望spring容器有条件地使用它们。为了解决这个问题,我们可能希望在我们的自动配置类中包含一个或多个“条件注解”。在这一节中,我们将讨论这些“条件注解”。
3.1:@ConditinalOnClass和@ConditionalOnMissing
这些注解也称为类条件。这些注释允许基于特定类的存在或 不存在的配置。让我们看看下面的例子来更清楚地理解这些条件。
@Configuration @ConditionalOnClass(DataSource.class) class DruidConfiguration { //... }
在上面的示例中,如果类路径中存在DataSource类,则该条件是匹配的,springboot将加载DruidConfiguration类中可用的配置。
@ConditinalOnMissingClass使用方式和@ConditionalOnClass类似,作用相反。
3.2:@ConditionalOnBean和@ConditionalOnMissingBean
这些注解也称为bean条件,并根据特定bean的存在或不存在来决定是否暴露bean。
@Configuration public class JdbcTemplateConfig { @Bean @ConditionalOnBean(DataSource.class) public JdbcTemplate jdbcTemplate() { // } }
在前面的示例中,如果DataSource类型的bean已经在ApplicationContext上下文中,则spring创建JdbcTemplate的 bean。@ConditionOnMissingBean的使用方式相似,但作用相反。
3.3:@ConditionalOnProperty
@ConditionalOnProperty注解允许基于Spring环境属性进行配置。使用前缀和名称属性指定用于检查的属性。让我们举一个例子来更详细地理解它。
@ConditionalOnProperty(prefix = "spring.rabbitmq", name = "dynamic") public AmqpAdmin amqpAdmin(CachingConnectionFactory connectionFactory) { return new RabbitAdmin(connectionFactory); }
在上述配置中,如果spring.rabbitmq.dynamic存在于环境中,就返回RabbitAdmin实例。
3.4:@ConditionalOnResource
只有当@ConditionalOnResource指定资源存在时,才允许配置。让我们创建一个例子来更清楚地理解它。
@ConditionalOnResource(resources = "classpath:mysql.properties") Properties databaseProperties() { // ... }
在上面的示例中,如果在类路径中提供mysql属性文件,则添加额外的数据库属性。
3.5:@ConditionalOnWebApplication和@ConditionalOnNotWebApplication
这两个注解允许根据应用程序是否是“web应用”来包括配置。举一个例子,我们想为web应用程序暴露服务,为了处理这个用例,我们可以使用@ConditionalOnWebApplication注解。
@ConditionalOnWebApplication Version applicationVersion() { // .. }
3.6:@ConditionalOnExpression
@ConditionalOnExpression注解允许基于SPEL表达式的结果进行配置。当将SPEL表达式求值为真时,spring将使用标记定义。
@Controller @ConditionalOnExpression("${controller.enabled}) public class WebController { // ... }
让我们来看另一个例子,在其中我们只包含某些开发模式的配置。
@Bean @ConditionalOnExpression("${devonly}") DataSource dataSource() { // ... }
3.7:@Conditional
springboot的大部分自动配置功能是基于@Conditional注解构建的。spring4.0引入了@Conditional注解。此注解表明,当所有指定条件匹配时,组件才有资格进行注册。我们可以使用这个注解来构建我们自己自定义的本篇中不可用的条件。
为了更好地理解,假设我们想创建一个服务,它基于国内或国际旅行向客户推荐保险。
public interface Insurance { RecommendedPolicy insurance(); } @Component @Conditional(DomesticInsuranceCondition.class) public class DomesticInsurance implements Insurance { public RecommendedPolicy insurance() { System.out.println("Domestic Insurance"); return DomesticInsurance; } } @Component @Conditional(InternationalInsuranceCondition.class) public class InternationalInsurance implements Insurance { public RecommendedPolicy insurance() { System.out.println("International Insurance"); return InternationalInsurance; } }
4
总结
在本文中,我们探究了springboot注解。我们了解了不同的注解以及如何使用这些注解来调整springboot自动配置过程。