fastcampus Java SpringCore 강좌를들으면서 정리를 하였습니다.
ClassPath Scanning
특정 classpath 이하에 있는 관리할 컴포넌트(@Component)들을 등록을 하기 위해 스캔함
@Component : Annotation Type으로 런타임에 동작함. classpath scanning을 통해 자동적으로 검색됨.
@Repository, @Service, @Controller
@ComponentScan(basePackages = "kr.co.fastcampus.cli") 을 해주면 xml에 별도로 설정을 안해줘도 알아서 추가가 됨.
예시
@Configuration
@ComponentScan(basePackages = "kr.co.fastcampus.cli")
public class AppConfig {
@Bean
public A a1(){
return new A();
}
@Bean
@Scope("singleton")
public B b1(){
return new B();
}
}
@Component
class A {}
@Component
class B{}
아래와 같이 AnnotationConfigApplicationContext()를 사용해서 사용이 가능하다.
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
AnnotationConfigApplicationContext API 를 살펴보면 아래와 같이 파라미터를 넣어주면 사용이 가능하다.
Constructor and Description
AnnotationConfigApplicationContext()Create a new AnnotationConfigApplicationContext that needs to be populated through register(java.lang.Class...) calls and then manually refreshed.
AnnotationConfigApplicationContext(Class... componentClasses)Create a new AnnotationConfigApplicationContext, deriving bean definitions from the given component classes and automatically refreshing the context.
AnnotationConfigApplicationContext(DefaultListableBeanFactory beanFactory)Create a new AnnotationConfigApplicationContext with the given DefaultListableBeanFactory.
AnnotationConfigApplicationContext(String... basePackages)Create a new AnnotationConfigApplicationContext, scanning for components in the given packages, registering bean definitions for those components, and automatically refreshing the context.
Filter
ComponentScan에서 특정 클래스를 빼고 싶을 때, (pattern, class, 등 의 다양함 )
아래처럼 filter를 사용해서 execludeFilters를 사용하여 가능하다.
@Slf4j
@ComponentScan(basePackageClasses = Main.class , excludeFilters = @ComponentScan.Filter (type= FilterType.REGEX,pattern="kr.co.fastcampus.cli.B"))
public class Main {
static Logger logger = LoggerFactory.getLogger(Main.class);
public static void main(String []args) {
//Java Anotation을 사용한 주입
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Main.class);
B b = context.getBean(B.class);
log.info("b : "+b);
context.close();
}
}
ComponentScan 성능 향상
ComponentScan은 Java Generic을 사용하여 JVM에서 어노테이션이 붙어있는지 아닌지 결정하여 판단을 하게 되는데, 만약 어노테이션이 너무 많이 사용되게 되면 ComponentScan이 오래 걸릴 수 있다.
그래서 indexer를 만들어 놓음
pom.xml에 추가
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-indexer</artifactId>
<version>5.2.3.RELEASE</version>
<optional>true</optional>
</dependency>
</dependencies>
빌드를 하게 되면 META-INF/spring.components 가 만들어짐.
'BackEnd > Spring' 카테고리의 다른 글
ClassPath Scanning and Managed Components (0) | 2020.02.22 |
---|---|
Bean Scope (0) | 2020.02.11 |
Customizing the Nature of a Bean (0) | 2020.02.01 |
DI (Dependency Injection) (0) | 2020.02.01 |
Spring-Core (0) | 2020.01.19 |