springBoot@Enable*주해 사용
답:@SpringBootApplication,내부 작용 에 대한 주 해 는 사실 3 개 입 니 다.@EnableAutoConfiguration,@ComponentScan,@Configuration。이 글 은 주로@EnableXX 주석 을 설명 합 니 다.
2.왜@EnableAutoConfiguration 을 사 용 했 습 니까?@ConfigurationProperties 를 사용 하면.yml 또는.properties 의 설정 항목 을 자동 으로 가 져 올 수 있 습 니까?
답:@EnableAutoConfiguration 내부 에서@Import 주 해 를 사 용 했 습 니 다.AutoConfiguration ImportSelector 를 가 져 와 springBoot 가 조건 에 맞 는 Configuration 을 IOC 용기 에 불 러 올 수 있 도록 도 와 줍 니 다.하지만 내 부 는 사실 SpringFactories Loader 를 사용 해 완성 했다.자바 SPI 와 유사 한 기능
,즉/META-INF/spring.factories 에서 설정 불 러 오기
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration
@Import 를 볼 수 있 습 니 다.사실은 AutoConfiguration ImportSelector 의 종 류 를 가 져 왔 습 니 다.가장 중요 한 것 은 이 클래스 가 인터페이스 ImportSelector 를 실현 했다 는 것 이다.
public interface ImportSelector {
/**
* Select and return the names of which class(es) should be imported based on
* the {@link AnnotationMetadata} of the importing @{@link Configuration} class.
*/
String[] selectImports(AnnotationMetadata importingClassMetadata);
}
이것 은 ImportSelector 의 설명 입 니 다.아마도 이 방법 이 되 돌아 오 는 Bean 은 자동 으로 주입 되 어 Spring 에 의 해 관리 된다 는 뜻 입 니 다.이 어 AutoConfiguration ImportSelector 에서 selectImports 의 실현 을 살 펴 보 자.
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if(!this.isEnabled(annotationMetadata)) {
return NO_IMPORTS;
} else {
AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
configurations = this.removeDuplicates(configurations);
Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
this.checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = this.filter(configurations, autoConfigurationMetadata);
this.fireAutoConfigurationImportEvents(configurations, exclusions);
return StringUtils.toStringArray(configurations);
}
}
코드 를 모두 분명하게 썼 다.설명 안 할 게.@Import 에서 ImportBean Definition Registrar 를 가리 키 는 링크 를 볼 수 있 습 니 다.이것 역시 하나의 인터페이스 로 ImportSelector 와 같은 역할 을 한다.
public interface ImportBeanDefinitionRegistrar {
public void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);
}
registerBean Definitions 방법 에 서 는 Bean Definition Registry 로 우리 가 주입 하고 자 하 는 Bean 을 주입 할 수 있 습 니 다.코드 예제:
@Import 를 사용 하여 자신의@Enable 을 작성 합 니 다.
1、테스트 Bean 2 개 만 들 기
public class Role {
}
public class User {
}
2.사용자 정의 Enable 주석
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(MyEnableAutoConfig.class)
public @interface EnableBean {
}
3.자신의 EnableAutoConfiguration 클래스 구현
public class MyEnableAutoConfig implements ImportSelector{
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.xhn2.Role","com.xhn2.User"};
}
}
4.시작 클래스 작성
@EnableBean
@ComponentScan("com.xhn2")
public class Main {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(Main.class, args);
System.out.println(context.getBean(User.class));
System.out.println(context.getBean(Role.class));
}
}
5.실행 결과com.xhn2.User@496bc455
com.xhn2.Role@59402b8f
콘 솔 이 성공 적 으로 인쇄 되 었 습 니 다.
코드 예시 2,제3자 jar 패 키 지 를 자동 으로 조립 하 는 Bean
새 maven 프로젝트
1、pom.xml
<modelVersion>4.0.0</modelVersion>
<groupId>org.csp</groupId>
<artifactId>hello</artifactId>
<version>1.0.0</version>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.17.RELEASE</version>
</dependency>
</dependencies>
2.Configuration 작성
@Configuration
public class MyTest {
@Bean
public Runnable runnable() {
return ()->{};
}
}
resources 에 META-INF/spring.factories 파일 을 새로 만 들 고 다음 설정 을 추가 합 니 다.
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.edu.MyTest
3.프로젝트 를 로 컬 maven 창고 에 설치:mvn install4.주요 프로젝트 는 방금 로 컬 에 설 치 된 jar 를 도입 합 니 다.
<dependency>
<groupId>org.csp</groupId>
<artifactId>hello</artifactId>
<version>1.0.0</version>
</dependency>
5.방금 설정 한 Runnable 가 져 오기
@SpringBootApplication
public class Main {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Main.class);
ConfigurableApplicationContext context = application.run(args);
System.out.println(context.getBean(Runnable.class));
}
}
6.콘 솔 인쇄com.edu.MyTest$$Lambda$153/284686302@2c07545f
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.