标签:构建 tco text 的区别 tor producer log4 文件中 group
目录
Spring Cloud 构建于 Spring Boot 之上,在 Spring Boot 中有两种上下文,一种是 bootstrap, 另外一种是 application, bootstrap 是应用程序的父上下文,也就是说 bootstrap 加载优先于 applicaton。bootstrap 主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一个环境,它是任何Spring应用程序的外部属性的来源。bootstrap 里面的属性会优先加载,它们默认也不能被本地相同配置覆盖。
application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。
bootstrap 配置文件有以下几个应用场景。
一般上来说,当我们创建一个SpringBoot项目时,IDE会默认帮我们创建一个application.properties配置文件。有些朋友习惯把.properties文件改成.yml文件。那么这两种文件类型有什么区别呢?
yml语言以数据为中心
1.内容格式比较:
.properties文件,通过.来连接,通过=来赋值,结构上,没有分层的感觉,但比较直接。
.yml文件,通过:来分层,结构上,有比较明显的层次感,最后key赋值的:后需要留一个空格
2.执行顺序
如果工程中同时存在application.properties文件和 application.yml文件,yml文件会先加载,而后加载的properties文件会覆盖yml文件。所以建议工程中,只使用其中一种类型的文件即可。
从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
@Configurationpublic
class TaskAutoConfiguration
{
@Bean
@Profile("biz-electrfence-controller")
public BizElectrfenceControllerJob bizElectrfenceControllerJob()
{
return new BizElectrfenceControllerJob();
}
@Bean
@Profile("biz-consume-1-datasync")
public BizBikeElectrFenceTradeSyncJob bizBikeElectrFenceTradeSyncJob()
{
return new BizBikeElectrFenceTradeSyncJob();
}
}
做过web开发的同学一定都有用过@Controller,@Service,@Repository注解,查看其源码你会发现,他们中有一个共同的注解@Component,没错@ComponentScan注解默认就会装配标识了@Controller,@Service,@Repository,@Component注解的类到spring容器中。
@ComponentScan(value = "com.abacus.check.api")
public class CheckApiApplication
{
public static void main(String[] args)
{
SpringApplication.run(CheckApiApplication.class, args);
}
}
@SpringBootApplication注解也包含了@ComponentScan注解,所以在使用中我们也可以通过@SpringBootApplication注解的scanBasePackages属性进行配置。
@SpringBootApplication(scanBasePackages = {"com.abacus.check.api","com.abacus.check.service"})
public class CheckApiApplication
{
public static void main(String[] args)
{
SpringApplication.run(CheckApiApplication.class, args);
}
}
@Conditional是Spring4新提供的注解,通过@Conditional注解可以根据代码中设置的条件装载不同的bean,在设置条件注解之前,先要把装载的bean类去实现Condition接口,然后对该实现接口的类设置是否装载的条件。Spring Boot注解中的@ConditionalOnProperty、@ConditionalOnBean等以@Conditional*开头的注解,都是通过集成了@Conditional来实现相应功能的。
通过导入的方式实现把实例加入springIOC容器中。可以在需要时将没有被Spring容器管理的类导入至Spring容器中。
//类定义
public class Square {}public class Circular {}
//导入
@Import({Square.class,Circular.class})
@Configurationpublic
class MainConfig{}
和@Import类似,区别就是@ImportResource导入的是配置文件。
@ImportResource("classpath:spring-redis.xml")
//导入xml配置
public class CheckApiApplication
{
public static void main(String[] args)
{
SpringApplication.run(CheckApiApplication.class, args);
}
}
@Component是一个元注解,意思是可以注解其他类注解,如@Controller @Service @Repository。带此注解的类被看作组件,当使用基于注解的配置和类路径扫描的时候,这些类就会被实例化。其他类级别的注解也可以被认定为是一种特殊类型的组件,比如@Controller 控制器(注入服务)、@Service服务(注入dao)、@Repository dao(实现dao访问)。@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注,作用就相当于 XML配置,
说完与Spring Boot密切相关的几个Spring基础注解后,下面我们就再一起看看Spring Boot提供的核心注解的内容吧!
这个注解是Spring Boot最核心的注解,用在 Spring Boot的主类上,标识这是一个 Spring Boot 应用,用来开启 Spring Boot 的各项能力。实际上这个注解是@Configuration,@EnableAutoConfiguration,@ComponentScan三个注解的组合。由于这些注解一般都是一起使用,所以Spring Boot提供了一个统一的注解@SpringBootApplication。
@SpringBootApplication(exclude = {
MongoAutoConfiguration.class,
MongoDataAutoConfiguration.class,
DataSourceAutoConfiguration.class,
ValidationAutoConfiguration.class,
MybatisAutoConfiguration.class,
MailSenderAutoConfiguration.class,})
public class API
{
public static void main(String[] args)
{
SpringApplication.run(API.class, args);
}
}
允许 Spring Boot 自动配置注解,开启这个注解之后,Spring Boot 就能根据当前类路径下的包或者类来配置 Spring Bean。
如:当前类路径下有 Mybatis 这个 JAR 包,MybatisAutoConfiguration 注解就能根据相关参数来配置 Mybatis 的各个 Spring Bean。
@EnableAutoConfiguration实现的关键在于引入了AutoConfigurationImportSelector,其核心逻辑为selectImports方法,逻辑大致如下:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage//导入AutoConfigurationImportSelector
@Import({EnableAutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration
{
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
这个注解就是 @Configuration 注解的变体,只是用来修饰是 Spring Boot 配置而已,或者可利于 Spring Boot 后续的扩展。
@ConditionalOnBean(A.class)仅仅在当前上下文中存在A对象时,才会实例化一个Bean,也就是说只有当A.class 在spring的applicationContext中存在时,这个当前的bean才能够创建。
@Bean//当前环境上下文存在DefaultMQProducer实例时,才能创建RocketMQProducerLifecycleBean
@ConditionalOnBean(DefaultMQProducer.class)
public RocketMQProducerLifecycle rocketMQLifecycle()
{
return new RocketMQProducerLifecycle();
}
组合@Conditional注解,和@ConditionalOnBean注解相反,仅仅在当前上下文中不存在A对象时,才会实例化个Bean。
@Bean //仅当当前环境上下文缺失RocketMQProducer对象时,才允许创建RocketMQProducer Bean对象
@ConditionalOnMissingBean(RocketMQProducer.class)
public RocketMQProducer mqProducer()
{
return new RocketMQProducer();
}
组合 @Conditional 注解,可以仅当某些类存在于classpath上时候才创建某个Bean。
@Bean //当classpath中存在类HealthIndicator时,才创建HealthIndicator Bean对象
@ConditionalOnClass(HealthIndicator.class)
public HealthIndicator rocketMQProducerHealthIndicator(Map<String, DefaultMQProducer> producers) {
if (producers.size() == 1) {
return new RocketMQProducerHealthIndicator(producers.values().iterator().next()); }
}
组合@Conditional注解,和@ConditionalOnMissingClass注解相反,当classpath中没有指定的 Class才开启配置。
组合@Conditional 注解,当前项目类型是 WEB 项目才开启配置。当前项目有以下 3 种类型:ANY(任何Web项目都匹配)、SERVLET(仅但基础的Servelet项目才会匹配)、REACTIVE(只有基于响应的web应用程序才匹配)。
组合@Conditional注解,和@ConditionalOnWebApplication 注解相反,当前项目类型不是 WEB 项目才开启配置。
组合 @Conditional 注解,当指定的属性有指定的值时才开启配置。具体操作是通过其两个属性name以及havingValue来实现的,其中name用来从application.properties中读取某个属性值,如果该值为空,则返回false;如果值不为空,则将该值与havingValue指定的值进行比较,如果一样则返回true;否则返回false。如果返回值为false,则该configuration不生效;为true则生效。
@Bean //匹配属性rocketmq.producer.enabled值是否为true
@ConditionalOnProperty(value = "rocketmq.producer.enabled", havingValue = "true", matchIfMissing = true)
public RocketMQProducer mqProducer() {
return new RocketMQProducer();
}
组合 @Conditional 注解,当 SpEL 表达式为 true 时才开启配置。
@Configuration@ConditionalOnExpression("${enabled:false}")
public class BigpipeConfiguration {
@Bean
public OrderMessageMonitor orderMessageMonitor(ConfigContext configContext)
{
return new OrderMessageMonitor(configContext);
}
}
组合@Conditional 注解,当运行的 Java JVM 在指定的版本范围时才开启配置。
组合 @Conditional 注解,当类路径下有指定的资源才开启配置。
@Bean@ConditionalOnResource(resources="classpath:shiro.ini")protected Realm iniClasspathRealm(){ return new Realm();}
组合 @Conditional 注解,当指定的 JNDI 存在时才开启配置。
组合 @Conditional 注解,当指定的云平台激活时才开启配置。
组合 @Conditional 注解,当指定的 class 在容器中只有一个 Bean,或者同时有多个但为首选时才开启配置。
Spring Boot可使用注解的方式将自定义的properties文件映射到实体bean中,比如config.properties文件。
@Data@ConfigurationProperties("rocketmq.consumer")
public class RocketMQConsumerProperties extends RocketMQProperties {
private boolean enabled = true;
private String consumerGroup;
private MessageModel messageModel = MessageModel.CLUSTERING;
private ConsumeFromWhere consumeFromWhere =ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET; private int consumeThreadMin = 20;
private int consumeThreadMax = 64;
private int consumeConcurrentlyMaxSpan = 2000;
private int pullThresholdForQueue = 1000;
private int pullInterval = 0;
private int consumeMessageBatchMaxSize = 1;
private int pullBatchSize = 32;
}
当@EnableConfigurationProperties注解应用到你的@Configuration时,任何被@ConfigurationProperties注解的beans将自动被Environment属性配置。 这种风格的配置特别适合与SpringApplication的外部YAML配置进行配合使用。
@Configuration@EnableConfigurationProperties({
RocketMQProducerProperties.class, RocketMQConsumerProperties.class,})
@AutoConfigureOrderpublic class RocketMQAutoConfiguration
{
@Value("${spring.application.name}")
private String applicationName;
}
用在自动配置类上面,表示该自动配置类需要在另外指定的自动配置类配置完之后。
如 Mybatis 的自动配置类,需要在数据源自动配置类之后。
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisAutoConfiguration {}
这个和@AutoConfigureAfter注解使用相反,表示该自动配置类需要在另外指定的自动配置类配置之前。
Spring Boot 1.3.0中有一个新的注解@AutoConfigureOrder,用于确定配置加载的优先级顺序。
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) // 自动配置里面的最高优先级
@Configuration @ConditionalOnWebApplication // 仅限于web应用
@Import(BeanPostProcessorsRegistrar.class) // 导入内置容器的设置
public class EmbeddedServletContainerAutoConfiguration {
@Configuration
@ConditionalOnClass({ Servlet.class, Tomcat.class })
@ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT)
public static class EmbeddedTomcat {
// ...
}
@Configuration
@ConditionalOnClass({ Servlet.class, Server.class, Loader.class, WebAppContext.class })
@ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT)
public static class EmbeddedJetty {
// ...
}
}
使用Spring Boot很简单,先添加基础依赖包,有以下两种方式
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId> <version>1.5.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency></dependencyManagement>
springboot不需要独立的容器,它内置了 Tomcat/ Jetty 等容器。
1)打包用命令或者放到容器中运行
2)用 Maven/ Gradle 插件运行
3)直接执行 main 方法运行
@Configuration,@ConditionalOnClass就是自动配置的核心,首先它得是一个配置文件,其次根据类路径下是否有这个类去自动配置。
Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成Spring及其他技术,而不需要到处找示例代码和依赖包。如你想使用Spring JPA访问数据库,只要加入spring-boot-starter-data-jpa启动器依赖就能使用了。
Starters包含了许多项目中需要用到的依赖,它们能快速持续的运行,都是一系列得到支持的管理传递性依赖。
Spring Boot官方的启动器都是以spring-boot-starter-命名的,代表了一个特定的应用类型。
第三方的启动器不能以spring-boot开头命名,它们都被Spring Boot官方保留。一般一个第三方的应该这样命名,像mybatis的mybatis-spring-boot-starter。
启动器名称 | 功能描述 |
---|---|
spring-boot-starter | 包含自动配置、日志、YAML的支持。 |
spring-boot-starter-web | 使用Spring MVC构建web 工程,包含restful,默认使用Tomcat容器。 |
... | ... |
启动器名称 | 功能描述 |
---|---|
spring-boot-starter-actuator | 提供生产环境特性,能监控管理应用。 |
启动器名称 | 功能描述 |
---|---|
spring-boot-starter-json | 提供对JSON的读写支持。 |
spring-boot-starter-logging | 默认的日志启动器,默认使用Logback。 |
... | ... |
可以实现接口 ApplicationRunner 或者 CommandLineRunner,这两个接口实现方式一样,它们都只提供了一个 run 方法
如果你想在Spring Boot启动的时候运行一些特定的代码,你可以实现接口 ApplicationRunner
或者 CommandLineRunner
,这两个接口实现方式一样,它们都只提供了一个run方法。
CommandLineRunner:启动获取命令行参数。
public interface CommandLineRunner {
/**
* Callback used to run the bean.
* @param args incoming main method arguments
* @throws Exception on error */
void run(String... args) throws Exception;
}
ApplicationRunner:启动获取应用启动的时候参数。
public interface ApplicationRunner {
/**
* Callback used to run the bean.
* @param args incoming application arguments
* @throws Exception on error
*/
void run(ApplicationArguments args) throws Exception;
}
import org.springframework.boot.*import org.springframework.stereotype.*
@Componentpublic
class MyBean implements CommandLineRunner {
public void run(String... args)
{
// Do something...
}
}
或者这样
@Beanpublic CommandLineRunner init()
{
return (String... strings) -> { };
}
如果启动的时候有多个ApplicationRunner和CommandLineRunner,想控制它们的启动顺序,可以实现 org.springframework.core.Ordered
接口或者使用 org.springframework.core.annotation.Order
注解。
Spring Boot 可以通过 @PropertySource,@Value,@Environment, @ConfigurationProperties 来绑定变量
Spring Boot支持Java Util Logging,Log4j2,Lockback作为日志框架,如果你使用starters启动器,Spring Boot将使用Logback作为默认日志框架。无论使用哪种日志框架,Spring Boot都支持配置将日志输出到控制台或者文件中。
spring-boot-starter启动器包含spring-boot-starter-logging启动器并集成了slf4j日志抽象及Logback日志框架
标签:构建 tco text 的区别 tor producer log4 文件中 group
原文地址:https://www.cnblogs.com/lzxulxy/p/11641923.html