@Enable*
功能:开启某方面的支持
-
例子:
@EnableScheduling 开启计划任务的支持
@EnableAsync 开启异步方法的支持
@EnableAspectJAutoProxy 开启对 AspectJ 代理的支持
@EnableTransactionManagement 开启对事务的支持
-
@EnableCaching 开启对注解式缓存的支持
...
实际作用:所有@Enable* 注解都是有@Import的组合注解,@Enable* 自动开启的实现其实就是导入了一些自动配置的Bean
@Import 注解的用法
-
直接导入配置类(@Configuration 类)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(SchedulingConfiguration.class)
@Documented
public @interface EnableScheduling {
}
@Configuration
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public class SchedulingConfiguration {
@Bean(name = TaskManagementConfigUtils.SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME)
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public ScheduledAnnotationBeanPostProcessor scheduledAnnotationProcessor() {
return new ScheduledAnnotationBeanPostProcessor();
}
}
-
依据条件选择配置类(实现 ImportSelector 接口)
作用:配置类不确定,需根据@Import注解所标识的类或另一个注解(通常是注解)里的定义信息选择配置类
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(AsyncConfigurationSelector.class) public @interface EnableAsync { Class<? extends Annotation> annotation() default Annotation.class; boolean proxyTargetClass() default false; AdviceMode mode() default AdviceMode.PROXY; int order() default Ordered.LOWEST_PRECEDENCE; }
public class AsyncConfigurationSelector extends AdviceModeImportSelector<EnableAsync> { private static final String ASYNC_EXECUTION_ASPECT_CONFIGURATION_CLASS_NAME = "org.springframework.scheduling.aspectj.AspectJAsyncConfiguration"; @Override @Nullable public String[] selectImports(AdviceMode adviceMode) { switch (adviceMode) { case PROXY: return new String[] {ProxyAsyncConfiguration.class.getName()}; case ASPECTJ: return new String[] {ASYNC_EXECUTION_ASPECT_CONFIGURATION_CLASS_NAME}; default: return null; } } }
-
动态注册Bean(实现 ImportBeanDefinitionRegistrar 接口)
如果注入的bean不是确定类或者不是spring专用的(一般确切知道注入某个类的话,可以用@Component,@Service,@Repository,@Bean等),并不想用spring的注解进行侵入式标识,那么就可以通过@Import注解,实现ImportBeanDefinitionRegistrar接口来动态注册Bean
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(AspectJAutoProxyRegistrar.class) public @interface EnableAspectJAutoProxy { boolean proxyTargetClass() default false; boolean exposeProxy() default false; }
关键点在于 AspectJAutoProxyRegistrar实现了ImportBeanDefinitionRegistrar接口。ImportBeanDefinitionRegistrar的作用是在运行时自动添加Bean到已有的配置类。
例子:Mybatis 中大名鼎鼎的@MapperScan
@Role注解
- 标识Bean的类别
- 种类:
- ROLE_APPLICATION = 0
- bean的默认角色
- 标识应用的主要的主要角色
- 通常对应于用户定义的bean
- ROLE_SUPPORT = 1
- 标识较大配置的一部分
- 通常是仔细观察特定的ComponentDefinition时重要的提示,而不是体现在应用中
- ROLE_INFRASTRUCTURE = 2
- 标识后台角色,与最终用户无关
- 通常供是内部工作的bean使用
- ROLE_APPLICATION = 0
- 作用 : 目前不晓得