Spring-@Enable**주해 의 작업 원리

각종 Enable
@EnableAspectJAutoProxy
@EnableaspectJAutoProxy 주 해 는 Aspect 자동 프 록 시 를 활성화 하여 AspectJ 자동 프 록 시 에 대한 지원 을 엽 니 다.
AOP 의 자동 대 리 를 사용 할 때 자바 의 동적 대 리 를 이해 하면 AOP 의 자동 대 리 를 쉽게 익 힐 수 있 습 니 다.
@EnableAsync
@EnableAsync 주석 으로 비동기 방법 을 지원 합 니 다.그 건 다 들 잘 아 실 거 라 고 믿 습 니 다.비동기 에 대해 서 는 모두 이해 해 야 한다.
@EnableScheduling
@Enablescheduling 주석 으로 계획 작업 을 시작 하 는 지원즉,말 그대로 계획 퀘 스 트 를 시작 하 는 지원!보통@Scheduled 주해 의 협조 가 필요 합 니 다.
@EnableWebMVC
@EnableWebMVC 주 해 는 웹 MVC 의 설정 지원 을 엽 니 다.스프링 MVC 를 쓸 때 쓰 는 거 야.
@EnableConfigurationProperties
@EnableConfigurationProperties 주 해 는@ConfigurationProperties 주해 설정 Bean 에 대한 지원 을 시작 하 는 데 사 용 됩 니 다.즉,@EnableConfigurationProperties 주 해 는 Spring Boot 에@ConfigurationProperties 를 지원 할 수 있 도록 알려 줍 니 다.
@EnableJpaRepositories
@EnableJpaRepositories 주석 이 Spring Data JPA Repostory 에 대한 지원 을 엽 니 다.Spring Data JPA 프레임 워 크 는 주로 Spring 에서 유일 하 게 간소화 되 지 않 은 업무 논리 코드 를 대상 으로 합 니 다.이로써 개발 자 는 지구 층 의 업무 논 리 를 실현 하 는 작업 만 절약 하고 유일 하 게 해 야 할 일 은 지구 층 의 인 터 페 이 스 를 성명 하 는 것 입 니 다.다른 것 은 모두 Spring Data JPA 에 맡 기 겠 습 니 다!
@EnableTransactionManagement
@EnableTransactionManagement 주 해 는 주해 식 트 랜 잭 션 지원 을 시작 합 니 다.주해@EnableTransactionManagement 알림 Spring,@Transactional 주해 의 클래스 는 트 랜 잭 션 의 절단면 에 둘러싸 여 있 습 니 다.이렇게 하면@Transactional 에서 사용 할 수 있 습 니 다.
@EnableCaching
@EnableCashing 주해 주해 식 캐 시 지원 열기
이러한 간단 한@Enable*을 통 해 대량의 코드 를 설정 하지 않도록 기능 지원 을 시작 하여 사용 난이 도 를 어느 정도 낮 출 수 있 습 니 다.
이@Enable*주해 의 원본 코드 를 살 펴 보면 모든 주해 에@Import 주해 가 있 음 을 알 수 있 습 니 다.
@Import 주 해 는 설정 클래스 를 가 져 오 는 데 사 용 됩 니 다.즉,이 자동 으로 열 리 는 실현 은 자동 으로 설 정 된 Bean 을 가 져 온 것 입 니 다.
이 가 져 오기 설정 방식 은 주로 다음 과 같은 세 가지 유형 으로 나 뉜 다.
설정 클래스 직접 가 져 오기
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Import({SchedulingConfiguration.class})
@Documented
public @interface EnableScheduling {
}

//        SchedulingConfiguration
//       @Configuration,      scheduledAnnotationProcessor Bean
@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();
    }
}


조건 에 따라 설정 클래스 선택
@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;

}

// AsyncConfigurationSelector     ImportSelector
//         selectImports  ,             。

//        , adviceMode PORXY,   ProxyAsyncConfiguration     。 
//  activeMode ASPECTJ,   AspectJAsyncConfiguration   。

public class AsyncConfigurationSelector extends AdviceModeImportSelector {

    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;
        }
    }

}


동적 등록 Bean
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {
    boolean proxyTargetClass() default false;
}
// ImportBeanDefinitionRegistrar            Bean       
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);
        }
    }
}

Ref: https://blog.csdn.net/qq_26525215/article/details/53524844?utm_source=blogxgwz1

좋은 웹페이지 즐겨찾기