SpringBoot启动类常用注解

1. @SpringBootApplication

使用@AliasFor注解定义了4个参数,分别是"exclude","excludeName","basePackages","basePackagesClasses"

exclude指定不扫描的类,比如 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

excludeName直接指定不扫描的类名称

basePackages指明扫描路径

basePackagedClasses指明扫描的类

2. @EnableDiscoveryClient、@EnableEurekaClient

都用于注册发现服务,但是@EnableEurekaClient只适合Eureka,而@EnableDiscoveryClient可以是其它注册中心。从Spring Cloud Edgware开始,@EnableDiscoveryClient或@EnableEurekaClient可省略。只需加上相关依赖,并进行相应配置,即可将微服务注册到服务发现组件上。

3. @EnableTransactionManagement

支持事务管理,只要在service上加@Transaction。

4. @EnableConfigurationProperties

@EnableConfigurationProperties注解的作用是,使使用 @ConfigurationProperties 注解的类生效。

5. @EnableAsync

@EnableAsync可以让Spring启用异步方法执行,就跟在xml中配置<task:*> 效果是一样的。它可以跟@Configuration结合,让整个Spring环境启用基于注解的异步处理

默认情况下,Spring会查找一个关联的线程池:要么是一个org.springframework.core.task.TaskExecutor类型的bean,要么是一个类型是 java.util.concurrent.Executor名字是taskExecutor的bean。如果这两个都没找到,Spring会使用org.springframework.core.task.SimpleAsyncTaskExecutor来执行异步方法,SimpleAsyncTaskExecutor实际上并不是线程池,它是为每一个新任务创建一个新的线程。此外,如果异步方法的返回值是void,那么调用过程中的异常信息是无法返回给调用者的,默认只是记录日志。

ThreadPoolTaskExecutor并没有被Spring容器管理,可以在getAsyncExecutor() 上添加@Bean注解让它变成Spring管理的Bean。如果加入到Spring容器,那么就不需要手动调用executor.initialize() 做初始化了,因为在Bean初始化的时候会自动调用这个方法。

@Configuration
public class ThreadPoolConfig {

    @Bean
    public ThreadPoolTaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
        threadPoolTaskExecutor.setCorePoolSize(300);
        threadPoolTaskExecutor.setMaxPoolSize(500);
        threadPoolTaskExecutor.setQueueCapacity(300);
        threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        threadPoolTaskExecutor.setThreadNamePrefix("order-thread-");
        return threadPoolTaskExecutor;
    }
}

这里是自定义线程池的范例,使用了CallerRunsPolicy拒绝策略,注意这种拒绝策略如果线程池满,会将任务交给调度它的线程(比如主线程)去执行,存在将主线程搞崩的风险

6. @EnableScheduling

观察它的源码,发现它导入了SchedulingConfiguration类,而这个类会创建一个ScheduledAnnotationBeanPostProcessor,该processor中的processScheduled()方法会去处理加上了@Scheduled的方法。

 所以它的简单使用方法是,编写一个job类,在上面加上@Component注解,然后在方法上加上@Scheduled

7. @EnableFeignClients

OpenFeign的注解,相信很多人都用过,我们通过这个注解告诉框架扫描所有使用注解@FeignClient定义的feign客户端。

它的源码是这样的:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({FeignClientsRegistrar.class})
public @interface EnableFeignClients {
    String[] value() default {};

    String[] basePackages() default {};

    Class<?>[] basePackageClasses() default {};

    Class<?>[] defaultConfiguration() default {};

    Class<?>[] clients() default {};
}

我们看到这里导入了一个FeignClientRegistrar类,这个类用来扫描@FeignClient注解修饰的接口并注册到IoC容器。

 7. @EnableCaching

@EnableCaching注解是spring framework中的注解驱动的缓存管理功能。自spring版本3.1起加入了该注解。如果你使用了这个注解,那么你就不需要在XML文件中配置cache manager了。

当你在配置类(@Configuration)上使用@EnableCaching注解时,会触发一个post processor,这会扫描每一个spring bean,查看是否已经存在注解对应的缓存。如果找到了,就会自动创建一个代理拦截方法调用,使用缓存的bean执行处理。

待续...

posted @ 2022-03-16 08:06  方山客  阅读(1826)  评论(0编辑  收藏  举报