Пройдено в предыдущей серии статей:
1.@EnableAspectJAutoProxy
открытая параAspectJ
автоматическая поддержка прокси,оригинальный клик:Базовая конфигурация Spring4.x (3): Spring AOP.
2.@EnableAsync
Включить поддержку асинхронных методов,оригинальный клик:Дополнительные темы Spring 4.x (2): многопоточность.
3.@EnableScheduling
Включите поддержку запланированных задач,оригинальный клик:Расширенные темы Spring 4.x (3): запланированные задачи.
В следующей серии статей SpringMvc будет задействовано использование другого @Enable* через:
1.@EnableWebMvc
включиWeb
MVC
поддержка конфигурации.
2.@EnableConfigurationProperties
открытая пара@ConfigurationProperties
Конфигурация аннотацииBean
служба поддержки.
3.@EnableJpaRepositories
открытая параSpring
Data
JPA
Repository
служба поддержки.
4.@EnableTransactionManagement
Включает поддержку аннотированных транзакций.
5.@EnableCaching
Включить поддержку кэша аннотаций.
через простой@Enable*
Чтобы открыть поддержку функции, чтобы избежать самостоятельной настройки большого количества кода, что значительно снижает сложность использования. Так каков же принцип реализации этой магической функции? Давайте изучим это.
@Configuration
public class SchedulingConfiguration {
@Bean(name = TaskManagementConfigUtils.SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME)
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public ScheduledAnnotationBeanPostProcessor scheduledAnnotationProcessor() {
return new ScheduledAnnotationBeanPostProcessor();
}
}
наблюдая за этими@Enable*
В исходном коде аннотации обнаружено, что все аннотации имеют@Import
аннотация,@Import
Он используется для импорта классов конфигурации, что означает, что эти автоматически включенные реализации фактически импортируют некоторые автоматически настроенные компоненты. Эти импортированные конфигурации в основном делятся на следующие три типа:
1. Первая категория: напрямую импортировать класс конфигурации
@Target({java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Import({SchedulingConfiguration.class})
@Documented
public @interface EnableScheduling
{
}
можно увидетьEnableScheduling
ПРИМЕЧАНИЕ Прямой класс конфигурации импортаSchedulingConfiguration
, этот класс аннотируется@Configuration
и зарегистрировалscheduledAnnotationProcessor
Бин,SchedulingConfiguration
Исходный код выглядит следующим образом:
@Configuration
public class SchedulingConfiguration {
@Bean(name = TaskManagementConfigUtils.SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME)
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public ScheduledAnnotationBeanPostProcessor scheduledAnnotationProcessor() {
return new ScheduledAnnotationBeanPostProcessor();
}
}
2. Вторая категория: выберите категорию конфигурации в соответствии с условиями
@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;
}
AsyncConfigurationSelectort
Выберите класс конфигурации, который необходимо импортировать по условию.AsyncConfigurationSelector
Корневой интерфейсImportSelector
, этот интерфейс нужно переписатьselectImports
метод, при котором выносится предварительное суждение. В этом примере, еслиadviceMode
дляPROXY
, затем вернутьсяProxyAsyncConfiguration
Этот класс конфигурации; еслиadviceMode
дляASPECTJ
, затем вернутьсяAspectJAsyncConfiguration
Класс конфигурации, исходный код выглядит следующим образом:
public class AsyncConfigurationSelector extends AdviceModeImportSelector<EnableAsync> {
private static final String ASYNC_EXECUTION_ASPECT_CONFIGURATION_CLASS_NAME =
"org.springframework.scheduling.aspectj.AspectJAsyncConfiguration";
/**
* {@inheritDoc}
* @return {@link ProxyAsyncConfiguration} or {@code AspectJAsyncConfiguration} for
* {@code PROXY} and {@code ASPECTJ} values of {@link EnableAsync#mode()}, respectively
*/
@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;
}
}
}
3. Третья категория: динамическая регистрация бинов
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {
/**
* Indicate whether subclass-based (CGLIB) proxies are to be created as opposed
* to standard Java interface-based proxies. The default is {@code false}.
*/
boolean proxyTargetClass() default false;
}
AspectJAutoProxyRegistrar
ДостигнутоImportBeanDefinitionRegistrar
интерфейс,ImportBeanDefinitionRegistrar
Функция состоит в том, чтобы автоматически добавлять bean-компоненты в существующие классы конфигурации во время выполнения, переопределяя метод:
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry)
в,AnnotationMetadata
Параметр используется для получения аннотации к текущему классу конфигурации,BeanDefinitionRegistry
Параметры используются для регистрации бинов. Исходный код выглядит следующим образом:
class AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar {
/**
* Register, escalate, and configure the AspectJ auto proxy creator based on the value
* of the @{@link EnableAspectJAutoProxy#proxyTargetClass()} attribute on the importing
* {@code @Configuration} class.
*/
@Override
public void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);
AnnotationAttributes enableAJAutoProxy =
AnnotationConfigUtils.attributesFor(importingClassMetadata, EnableAspectJAutoProxy.class);
if (enableAJAutoProxy.getBoolean("proxyTargetClass")) {
AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);
}
}
}
награда Добро пожаловать в публичный аккаунт Life Designer в WeChat.Публичный идентификатор: longjiazuoA