[Spring] ComponentScan

κΉ€λŒ€μ€€Β·2022λ…„ 1μ›” 15일
0

spring

λͺ©λ‘ 보기
19/25
post-thumbnail

@ComponentScan


πŸ“Œ 1. @ComponentScan

@ComponentScanμ΄λž€, @Component 및 Stereo Type(@Service, @Repository, @Controller)이 λΆ€μ—¬λœ ν΄λž˜μŠ€λ“€μ„ μžλ™μœΌλ‘œ μŠ€μΊ”ν•˜μ—¬ 빈으둜 λ“±λ‘ν•΄μ£ΌλŠ” 역할을 ν•œλ‹€.

빈으둜 등둝 될 μ€€λΉ„λ₯Ό 마친 ν΄λž˜μŠ€λ“€μ„ μŠ€μΊ”ν•˜μ—¬, 빈으둜 λ“±λ‘ν•΄μ£ΌλŠ” 것이닀.
빈으둜 등둝 될 μ€€λΉ„λž€, ν΄λž˜μŠ€μ— @Component 및 Stereo Type(@Service, @Repository, @Controller)을 λΆ™μ—¬μ„œ 빈으둜 등둝 될 μ€€λΉ„λ₯Ό ν•œ 것이닀.


이전 xmlνŒŒμΌμ— <context:component-scan base-package="νŒ¨ν‚€μ§€κ²½λ‘œ"/>λ₯Ό μ΄μš©ν•΄ μ§€μ •ν•΄μ£Όμ—ˆλ˜ 것을 javaνŒŒμΌμ„ μ΄μš©ν•˜μ—¬ λΉˆμ„ μŠ€μΊ”ν•˜κΈ° μœ„ν•΄ 생겨났닀.
μ–΄λ–€ μ• λ…Έν…Œμ΄μ…˜μ„ μŠ€μΊ”ν• μ§€ λ˜λŠ” ν•˜μ§€ μ•Šμ„μ§€ κ²°μ •ν•˜λŠ” Filter κΈ°λŠ₯을 가지고 μžˆλ‹€.

@ComponentScanμ—μ„œ μ€‘μš”ν•œ μ„€μ •μœΌλ‘œλŠ” BasePackages와 BasePackageClasses κ°€ μžˆλ‹€.
BasePackagesλŠ” String으둜 μž…λ ₯된 νŒ¨μΊμ§€μ˜ 경둜λ₯Ό μŠ€μΊ”ν•˜λŠ” 방법이닀.
BasePackageClassesλŠ” μ „λ‹¬λœ 클래슀의 μœ„μΉ˜λ₯Ό κΈ°μ€€μœΌλ‘œ μŠ€μΊ”ν•˜λŠ” 방법이닀.

BasePackageClasses μ‚¬μš©μ„ 더 μΆ”μ²œν•œλ‹€.


StringBootλ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ μš°λ¦¬κ°€ λ”°λ‘œ μ„€μ •ν•˜μ§€ μ•ŠλŠ” 이상 @ComponentScan을 보기 νž˜λ“€λ‹€.
κ·Έ μ΄μœ λŠ” @SpringBootApplication이 @ComponentScanμ΄λž‘ @Configuration을 λ“€κ³  있기 λ•Œλ¬Έμ΄λ‹€.



πŸ“Œ 2. @ComponentScan의 μŠ€μΊ” κΈ°λ³Έ λŒ€μƒ

  1. @Component : μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”μ—μ„œ μ‚¬μš©
  2. @Controller : μŠ€ν”„λ§ MVC μ»¨νŠΈλ‘€λŸ¬μ—μ„œ μ‚¬μš©
  3. @Service : μŠ€ν”„λ§ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ—μ„œ μ‚¬μš©
  4. @Repository : μŠ€ν”„λ§ 데이터 μ ‘κ·Ό κ³„μΈ΅μ—μ„œ μ‚¬μš©
  5. @Configuration : μŠ€ν”„λ§ μ„€μ • μ •λ³΄μ—μ„œ μ‚¬μš©



πŸ“Œ 3. @ComponentScan λ™μž‘ κ³Όμ •

β‘  @Configuration νŒŒμ‹±
ConfigurationClassParserκ°€ @Configuration 클래슀λ₯Ό νŒŒμ‹±ν•œλ‹€.

β‘‘ @ComponentScan μ„€μ • νŒŒμ‹±
κ°œλ°œμžλŠ” basePackage, basePackesClasses, excludeFilters, includeFilters, lazyInit, nameGenerator, resourcePattern, scopeProxy λ“± μ»΄ν¬λ„ŒνŠΈλ“€μ„ μŠ€μΊ”ν•˜κΈ° μœ„ν•œ 섀정을 μ •μ˜ν•œλ‹€. ComponentScanAnnotationParseκ°€ μ»΄ν¬λ„ŒνŠΈ 후보λ₯Ό λͺ¨λ‘ μ°Ύκ³ , μŠ€μΊ”ν•˜κΈ° μœ„ν•΄ 섀정을 νŒŒμ‹±ν•œλ‹€.

β‘’ 클래슀 λ‘œλ”©
base-package 섀정을 λ°”νƒ•μœΌλ‘œ λͺ¨λ“  클래슀λ₯Ό λ‘œλ”©ν•œλ‹€. (*.class)
ν΄λž˜μŠ€λ‘œλ”λ₯Ό μ΄μš©ν•˜μ—¬ λͺ¨λ“  μžμ›μ„ Resource μΈν„°νŽ˜μ΄μŠ€ ν˜•νƒœλ‘œ λΆˆλŸ¬μ˜¨λ‹€.

β‘£ 빈 μ •μ˜ μ„€μ •
ClassLoaderκ°€ λ‘œλ”©ν•œ 클래슀λ₯Ό BeanDefinition으둜 μ •μ˜ν•œλ‹€.
그리고 beanName의 keyκ°’μœΌλ‘œ BeanDefinitionRegistry에 λ“±λ‘ν•΄λ†“λŠ”λ‹€.
생성할 λΉˆμ— λŒ€ν•œ μ •μ˜(메타 데이터)λ‹€.

β‘€ 빈 생성 & μ£Όμž….
μ„€μ •ν•œ 빈 μ •μ˜λ₯Ό λ°”νƒ•μœΌλ‘œ 객체λ₯Ό μƒμ„±ν•˜κ³ , μ£Όμž…ν•œλ‹€.

πŸ’‘ 정리
Configuration 클래슀 및 μ• λ…Έν…Œμ΄μ…˜μ— μ‚¬μš©ν•˜λŠ” 섀정듀을 νŒŒμ‹±ν•œλ‹€.
basePackage의 ν•˜μœ„ ν΄λž˜μŠ€λ“€μ„ λΆˆλŸ¬μ™€μ„œ Component 후보인지 확인 ν›„ BeanDefinition(빈 생성을 μœ„ν•œ μ •μ˜) 을 λ§Œλ“ λ‹€.
μƒμ„±λœ 빈 μ •μ˜λ₯Ό λ°”νƒ•μœΌλ‘œ λΉˆμ„ μƒμ„±ν•˜κ³  μ˜μ‘΄μ„±μžˆλŠ” λΉˆλ“€μ„ μ£Όμž…ν•œλ‹€.



πŸ“Œ 4. @CompoenentScan μ‚¬μš©λ°©λ²•

@CompoenentScan μ‚¬μš© 방법은 xmlνŒŒμΌμ— μ„€μ •ν•˜λŠ” 방법과 μžλ°”νŒŒμΌμ•ˆμ—μ„œ μ„€μ •ν•˜λŠ” 방법이 μžˆλ‹€.

βœ” 4-1 xml νŒŒμΌμ— μ„€μ •

<context:component-scan base-package="com.rcod.lifelog"/> 

xml νŒŒμΌμ— μ„€μ •ν•˜κ³ , base-package을 적어주면 base-package κΈ°μ€€μœΌλ‘œ ν΄λž˜μŠ€λ“€μ„ μŠ€μΊ”ν•˜μ—¬ 빈으둜 λ“±λ‘ν•œλ‹€. base-package에 μ—¬λŸ¬κ°œμ˜ νŒ¨ν‚€μ§€λ₯Ό μ“Έ 수 μžˆλ‹€.


<context:component-scan base-package="com.rcod.lifelog, com.rcod.example"/> 

μœ„μ™€ 같이 μ„€μ •ν•˜λ©΄, base packageν•˜μœ„μ˜ @Controll, @Service, @Repository, @Component ν΄λž˜μŠ€κ°€ λͺ¨λ‘ 빈으둜 λ“±λ‘λ˜λ―€λ‘œ, νŠΉμ •ν•œ 객체만 빈으둜 λ“±λ‘ν•˜μ—¬ μ‚¬μš©ν•˜κ³  μ‹Άλ‹€λ©΄ include-filter λ˜λŠ” exclude-filterλ₯Ό 톡해 μ„€μ •ν•  수 μžˆλ‹€.

πŸ” include-filter

<context:component-scan base-package="com.rcod.lifelog" use-default="false">
    <context:include-filter type="annotation" 
        expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

use-default="false"λŠ” κΈ°λ³Έ μ• λ…Έν…Œμ΄μ…˜ @Controller, @Component등을 μŠ€μΊ”ν•˜μ§€ μ•ŠλŠ” λ‹€λŠ” 것이닀.
κΈ°λ³Έ μ• λ…Έν…Œμ΄μ…˜μ„ μŠ€μΊ”ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  μ„€μ •ν•˜κ³ , include-filter을 ν†΅ν•΄μ„œ νŠΉμ • μ• λ…Έν…Œμ΄μ…˜λ§Œ μŠ€μΊ”ν•  수 μžˆλ‹€.


πŸ” exclude-filter

<context:component-scan base-package="com.rcod.lifelog">
    <context:exclude-filter type="annotation" 
        expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

@Controllerλ₯Ό μ œμ™Έν•˜κ³  μ‹Άλ‹€λ©΄ exclude-filterλ₯Ό μ‚¬μš©ν•˜μ—¬ org.springframework.stereotype.Controller λ₯Ό λͺ…μ‹œν•œλ‹€.


βœ” 4-2 javaνŒŒμΌμ— μ„€μ •

πŸ’‘ λ™μž‘ μˆœμ„œ
β‘  @Comfiguration, @ConponentScan 지정
β‘‘ 각 ν΄λž˜μŠ€κ°€ μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”μ˜ λŒ€μƒμ΄ λ˜λ„λ‘ @Component 지정
β‘’ @Component둜 μ§€μ •λœ ν΄λž˜μŠ€μ—μ„œ μƒμ„±μž λ©”μ„œλ“œμ— @Autowired을 μ§€μ •ν•˜μ—¬ μ˜μ‘΄κ΄€κ³„ μ£Όμž…

β‘ @Comfiguration, @ConponentScan 지정

package hello.core;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan
public class AutoAppConfig {}

@Configuration을 μ΄μš©ν•˜μ—¬ 빈 μ„€μ •νŒŒμΌ(XML νŒŒμΌμ„ λŒ€μ²΄ν•˜λŠ”)μž„μ„ μ•Œλ €μ€€λ‹€.
@ComponentScan 을 μ΄μš©ν•΄ 빈으둜 λ“±λ‘λ˜κΈ° μœ„ν•œ μ• λ…Έν…Œμ΄μ…˜μ΄ λΆ€μ—¬λœ ν΄λž˜μŠ€λ“€μ„ μžλ™μœΌλ‘œ IoCμ»¨ν…Œμ΄λ„ˆμ— λ“±λ‘ν•˜λ„λ‘ ν•œλ‹€.
@ComponentScan을 μ‚¬μš©ν•˜λ©΄ @Configuration이 뢙은 μ„€μ • 정보도 μžλ™μœΌλ‘œ μŠ€ν”„λ§ IoC μ»¨ν…Œμ΄λ„ˆμ˜ 빈으둜 λ“±λ‘λœλ‹€.
@Configuration의 μ†ŒμŠ€μ½”λ“œμ— @Conponentκ°€ ν¬ν•¨λ˜μ–΄ 있기 λ•Œλ¬Έμ΄λ‹€.


β‘‘ 각 ν΄λž˜μŠ€κ°€ μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”μ˜ λŒ€μƒμ΄ λ˜λ„λ‘ @Component 지정

package hello.core.member;

import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

@Component
public class MemoryMemberRepository implements  MemberRepository{

    private  static Map<Long, Member> store = new HashMap<>();

    @Override
    public void save(Member member) {
        store.put(member.getId(), member);
    }

    @Override
    public Member findById(Long memberId) {
        return store.get(memberId);
    }
}

μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”

@ComponentScan은 @Componentκ°€ 뢙은 λͺ¨λ“  클래슀λ₯Ό μŠ€ν”„λ§ 빈으둜 λ“±λ‘ν•œλ‹€.
이 λ•Œ μŠ€ν”„λ§ 빈의 κΈ°λ³Έ 이름은 클래슀 λͺ…을 μ‚¬μš©ν•˜λ˜ 맨 μ•žκΈ€μžλ§Œ μ†Œλ¬Έμžλ₯Ό μ‚¬μš©ν•œλ‹€.
빈 이름을 직접 μ§€μ •ν•˜κ³  싢을 λ•ŒλŠ” @Component("μ›ν•˜λŠ”μ΄λ¦„") 으둜 μž‘μ„±ν•œλ‹€.


β‘’ @Component둜 μ§€μ •λœ ν΄λž˜μŠ€μ—μ„œ μƒμ„±μž λ©”μ„œλ“œμ— @Autowired을 μ§€μ •ν•˜μ—¬ μ˜μ‘΄κ΄€κ³„ μ£Όμž…

package hello.core.member;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MemberServiceImpl implements  MemberService{

    private final MemberRepository memberRepository;

    @Autowired 
    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

    @Override
    public void join(Member member) {
        memberRepository.save(member);
    }

    @Override
    public Member findMember(Long memberId) {
        return memberRepository.findById(memberId);
    }
}

μ˜μ‘΄κ΄€κ³„ μžλ™ μ£Όμž…

μƒμ„±μžμ— @Autowiredλ₯Ό μ§€μ •ν•˜λ©΄, μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆκ°€ μžλ™μœΌλ‘œ ν•΄λ‹Ή μŠ€ν”„λ§ λΉˆμ„ μ°Ύμ•„μ„œ μ£Όμž…ν•œλ‹€.
이 λ•Œ κΈ°λ³Έ 쑰회 μ „λž΅μ€ νƒ€μž…μ΄ 같은 λΉˆμ„ μ°Ύμ•„μ„œ μ£Όμž…ν•œλ‹€.
getBean(MemberRepository.class)와 λ™μΌν•˜λ‹€.

μ˜μ‘΄κ΄€κ³„ μžλ™ μ£Όμž… 2

μƒμ„±μžμ— νŒŒλΌλ―Έν„°κ°€ λ§Žμ•„λ„ λ‹€ μ°Ύμ•„μ„œ μžλ™μœΌλ‘œ μ£Όμž…ν•œλ‹€.


πŸ” @ComponentScan λ²”μœ„

basePackages

@Configuration
@ComponentScan(basePackages = "com.kureungkureung.spring")
public class ApplicationConfig {}

basePackages의 경우 κ΄„ν˜Έμ•ˆμ— 직접 νŒ¨ν‚€μ§€ 경둜λ₯Ό 적어주어 μŠ€μΊ”ν•  μœ„μΉ˜λ₯Ό μ •ν•œλ‹€.

basePackages = {"hello.core", "hello.service"} 처럼 μ—¬λŸ¬ μ‹œμž‘ μœ„μΉ˜λ₯Ό 지정할 μˆ˜λ„ μžˆλ‹€.

basePackagesλŠ” Typesafeν•˜μ§€ μ•Šμ•˜κΈ° 떄문에 쑰금만 μ² μžκ°€ 잘λͺ»λ˜λ”라도 μŠ€μΊ”μ„ λͺ»ν•˜λŠ” 였λ₯˜κ°€ λ‚˜νƒ€λ‚  수 μžˆλ‹€.


basePackagesClasses

@Configuration
@ComponentScan(basePackageClasses = Application.class)
public class ApplicationConfig {}

basePackageClasses의 κ²½μš°μ—λŠ” κ΄„ν˜Έμ•ˆμ— 적힌 ν΄λž˜μŠ€κ°€ μœ„μΉ˜ν•œ κ³³μ—μ„œλΆ€ν„° λͺ¨λ“  μ• λ…Έν…Œμ΄μ…˜μ΄ λΆ€μ—¬λœ 클래슀λ₯Ό 빈으둜 λ“±λ‘ν•œλ‹€.
basePackageClassesλ₯Ό μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ @ComponentScan이 뢙은 μ„€μ • 정보 클래슀의 νŒ¨ν‚€μ§€κ°€ μ‹œμž‘ μœ„μΉ˜κ°€ λœλ‹€.
basePackagesClassesλŠ” 클래슀λ₯Ό 톡해 κΈ°μž…ν•˜κΈ° λ•Œλ¬Έμ— 훨씬 Typesafeν•œ 방법이닀.


🧷 ꢌμž₯ 방법
νŒ¨ν‚€μ§€ μœ„μΉ˜λ₯Ό μ§€μ •ν•˜μ§€ μ•Šκ³ , μ„€μ • 정보 클래슀의 μœ„μΉ˜λ₯Ό ν”„λ‘œμ νŠΈ μ΅œμƒλ‹¨μ— λ‘λŠ” 것이닀.
졜근 μŠ€ν”„λ§ λΆ€νŠΈλ„ 이 방법을 기본으둜 μ œκ³΅ν•œλ‹€.

ex) ν”„λ‘œμ νŠΈ ꡬ쑰
com.hello
com.hello.service
com.hello.repository
μ΄λ ‡κ²Œ μžˆλ‹€κ³  κ°€μ •ν•  λ•Œ,

  • com.hello 에 ν”„λ‘œμ νŠΈ μ‹œμž‘ 루트인 AppConfig같은 메인 μ„€μ • 정보λ₯Ό 두고 @ComponentScan 을 뢙이고 basePackages 지정을 μƒλž΅ν•œλ‹€.

참고둜 μŠ€ν”„λ§ λΆ€νŠΈλ₯Ό μ‚¬μš©ν•˜λ©΄ μŠ€ν”„λ§ λΆ€νŠΈμ˜ λŒ€ν‘œ μ‹œμž‘ 정보인 @SpringBootApplication을 ν”„λ‘œμ νŠΈ μ‹œμž‘ 루트 μœ„μΉ˜μ— λ‘¬μ•Όν•œλ‹€.


πŸ” ν•„ν„°

includeFilters
μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ” λŒ€μƒμ„ μΆ”κ°€λ‘œ μ§€μ •ν•œλ‹€.
@Component λ₯Ό 써도 μΆ©λΆ„ν•˜κΈ° λ•Œλ¬Έμ— includeFiltersλ₯Ό μ‚¬μš©ν•  일은 거의 μ—†λ‹€.

package hello.core.scan.filter;

import java.lang.annotation.*;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented

public @interface MyIncludeComponent { }
package hello.core.scan.filter;

@MyIncludeComponent
public class BeanA { }

πŸ‘€ @Target
μ• λ…Έν…Œμ΄μ…˜μ΄ μ μš©ν•  μœ„μΉ˜λ₯Ό μ„ νƒν•œλ‹€.
μ• λ…Έν…Œμ΄μ…˜μ΄ 생성될 수 μžˆλŠ” μœ„μΉ˜λ₯Ό μ§€μ •ν•œλ‹€.

  • ElementType.PACKAGE : νŒ¨ν‚€μ§€ μ„ μ–Έ
  • ElementType.TYPE : νƒ€μž… μ„ μ–Έ
  • ElementType.ANNOTATION_TYPE : μ• λ…Έν…Œμ΄μ…˜ νƒ€μž… μ„ μ–Έ
  • ElementType.CONSTRUCTOR : μƒμ„±μž μ„ μ–Έ
  • ElementType.FIELD : 멀버 λ³€μˆ˜ μ„ μ–Έ
  • ElementType.LOCAL_VARIABLE : 지역 λ³€μˆ˜ μ„ μ–Έ
  • ElementType.METHOD : λ©”μ„œλ“œ μ„ μ–Έ
  • ElementType.PARAMETER : λ©”μ†Œλ“œμ˜ νŒŒλΌλ―Έν„°λ‘œ μ„ μ–Έλœ κ°μ²΄μ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯
  • ElementType.TYPE_PARAMETER : μ „λ‹¬μΈμž νƒ€μž… μ„ μ–Έ
  • ElementType.TYPE_USE : νƒ€μž… μ„ μ–Έ

πŸ‘€ @Retention
ν•΄λ‹Ή μ• λ…Έν…Œμ΄μ…˜μ΄ μ–Έμ œκΉŒμ§€ μœ μ§€ν• μ§€ μ•Œλ €μ£ΌλŠ” μ• λ…Έν…Œμ΄μ…˜μ΄λ‹€.
자기 μžμ‹ μ΄ μ–΄λŠ μ‹œμ κΉŒμ§€ μœ νš¨ν•œμ§€λ₯Ό λͺ…μ‹œν•΄μ€˜μ•Όν•œλ‹€.

  • RetentionPolicy.SOURCE : 컴파일 μ „κΉŒμ§€λ§Œ 유효. (컴파일 μ΄ν›„μ—λŠ” 사라짐)
  • RetentionPolicy.CLASS : μ»΄νŒŒμΌλŸ¬κ°€ 클래슀λ₯Ό μ°Έμ‘°ν•  λ•ŒκΉŒμ§€ 유효.
  • RetentionPolicy.RUNTIME : 컴파일 이후에도 JVM에 μ˜ν•΄ 계속 μ°Έμ‘°κ°€ κ°€λŠ₯. (λ¦¬ν”Œλ ‰μ…˜ μ‚¬μš©)

πŸ‘€ @Documented
메타 데이터 μ• λ…Έν…Œμ΄μ…˜μ΄λ‹€.
λ¬Έμ„œμ— μ• λ…Έν…Œμ΄μ…˜μ˜ 정보가 ν‘œν˜„λœλ‹€.
μ• λ…Έν…Œμ΄μ…˜μ„ μ •μ˜ν•  λ•Œ, @Documentedν˜•νƒœλ‘œ μ μš©ν•˜μ—¬, ν•΄λ‹Ή μ• λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λŠ” ν΄λž˜μŠ€κ°€ javadocκ³Ό 같은 λ¬Έμ„œν™” 될 λ•Œ, ν•΄λ‹Ή μ• λ…Έν…Œμ΄μ…˜μ΄ 적용 λ˜μ—ˆμŒμ„ λͺ…μ‹œν•˜λ„λ‘ ν•œλ‹€.


excludeFilters
μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”μ—μ„œ μ œμ™Έν•  λŒ€μƒμ„ μ§€μ •ν•œλ‹€.
excludeFiltersλŠ” μ—¬λŸ¬κ°€μ§€ 이유둜 κ°„ν˜Ή μ‚¬μš©ν•  λ•Œκ°€ μžˆμ§€λ§Œ λ§Žμ§€λŠ” μ•Šλ‹€.

package hello.core.scan.filter;

import java.lang.annotation.*;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented

public @interface MyExcludeComponent { }
package hello.core.scan.filter;

@MyExcludeComponent
public class BeanB { }

μŠ€ν”„λ§ λΆ€νŠΈλŠ” μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”μ„ 기본으둜 μ œκ³΅ν•œλ‹€. μ˜΅μ…˜μ„ λ³€κ²½ν•˜λ©΄μ„œ μ‚¬μš©ν•˜κΈ° λ³΄λ‹€λŠ” μŠ€ν”„λ§μ˜ κΈ°λ³Έ 섀정에 μ΅œλŒ€ν•œ λ§žμΆ”μ–΄ μ‚¬μš©ν•˜λŠ”κ²ƒμ΄ μ’‹λ‹€.

@ComponentScan(
 includeFilters = @Filter(type = FilterType.ANNOTATION, classes =

MyIncludeComponent.class),
 excludeFilters = @Filter(type = FilterType.ANNOTATION, classes =

MyExcludeComponent.class)
)

includeFilters에 MyIncludeConponent μ• λ…Έν…Œμ΄μ…˜μ„ μΆ”κ°€ν•΄μ„œ BeanAκ°€ μŠ€ν”„λ§ λΉˆμ— λ“±λ‘λœλ‹€.
excludeFilters에 MyExcludeComponent μ• λ…Έν…Œμ΄μ…˜μ„ μΆ”κ°€ν•΄μ„œ BeanBλŠ” μŠ€ν”„λ§ λΉˆμ— λ“±λ‘λ˜μ§€ μ•ŠλŠ”λ‹€.




참고 자료


μŠ€ν”„λ§ 핡심원리 - 기본편 (μΈν”„λŸ° - κΉ€μ˜ν•œ)

https://jess-m.tistory.com/14

https://galid1.tistory.com/510

https://velog.io/@hyun-jii/%EC%8A%A4%ED%94%84%EB%A7%81-component-scan-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EB%8F%99%EC%9E%91-%EA%B3%BC%EC%A0%95

https://jjingho.tistory.com/9

profile
kureungkureung

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보