Spring Boot——Spring回顾——Spring高级话题

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)

猜你喜欢

转载自blog.csdn.net/qq_34479912/article/details/83308197