1、Spring Aware
Spring提供Aware接口能让Bean感知Spring容器的存在,即让Bean可以使用Spring容器所提供的资源。
Spring Aware演示Bean
配置类
运行
2、多线程
Spring通过任务执行器(TaskExecutor)来实现多线程和并发编程。使用ThreadPoolTaskExecutor可实现一个机遇线程池的TaskExecutor。而实际开发中任务一般是非阻碍的,即异步的,所以我们要在配置类中通过@EnabelAsync开启对异步任务的支持,并通过在实际执行的Bean方法中使用@Async注解来声明其是一个异步任务。
配置类
任务执行类
运行
3、计划任务
计划任务执行类
配置类
运行
4、条件注解@Conditional
@Conditional根据满足某一个特定条件创建一个特定的Bean。
判断条件定义
判断Windows定义
判断Linux定义
接口
Windows下所要创建的Bean类
Linux下所要创建的Bean的类
配置类
运行
5、组合注解与元注解
元注解:可以注解到别的注解上的注解。
组合注解:被元注解 注解的注解称为组合注解,组合注解具备元注解的功能。
示例组合注解
演示服务Bean
新的配置类
运行
6、@Enable*注解的工作原理
@EnableAspectJAutoProxy开启对AspectJ自动代理的支持。
@EnableAsync开启异步方法的支持。
@EnableScheduling开启计划任务的支持。
@EnableWebMvc开启Web MVC的支持。
@EnableConfigurationProperties开启对@ConfigurationProperties注解配置Bean的支持。
@EnableJpaRepositories开启对Spring Data JPA Reposity的支持。
@EnableTransactionManagement开启注解式事务的支持。
@EnableCaching开启注解式的缓存支持。
通过简单的@Enable*来开启一项功能的支持,从而避免了自己配置大量的代码,大大降低使用难度。
直接导入配置类
直接导入配置类SchedulingConfiguration,SchedulingConfiguration注解了@Configuration,且注册了ScheduledAnnotationBeanPostProcessor的Bean,源码如下:
依据条件选择配置类
AsyncConfigurationSelector通过条件来选择需要导入的配置类,AsyncConfigurationSelector的根接口是ImportSelector,这个接口需要实现selectImports方法,在该方法中进行了条件判断。如果adviceMode为PROXY,则返回ProxyAsyncConfiguration这个配置类;如果为ASPECTJ,则返回AspectJAsyncConfiguration配置类,源码如下:
public class AsyncConfigurationSelector extends AdviceModeImportSelector<EnableAsync> {
private static final String ASYNC_EXECUTION_ASPECT_CONFIGURATION_CLASS_NAME =
"org.springframework.scheduling.aspectj.AspectJAsyncConfiguration";
@Override
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
AspectJAutoProxyRegistrar实现了ImportBeanDefinitionRegistrar接口,ImportBeanDefinitionRegistrar的作用是在运行时自动添加Bean到已有的配置类,通过重写下面方法:
其中,AnnotationMetadata参数用来获得当前配置类上的注解:BeanDefinitionRegistry参数用来注册Bean。源码如下:
7、测试
准备
业务代码
配置类
测试(src/test/java)