프로그래밍/Spring & Spring boot

03 Spring : Bean 등록 방법_ ComponentScan - basePackages

pupu91 2022. 9. 1. 16:21
반응형

 

 

1. ComponentScan

    : base-package로 설정 된 하위 경로에 특정 어노테이션을 가지고 있는 클래스를 이용하여 bea으로 등록하는 기능

      @Component 어노테이션이 작성 된 클래스를 인식하여 bean으로 등록

      특수 목적에 따라 세부 기능을 제공하는 @Controller, @Service, @Repository, @Configuration등을 인식

 

                                                    컴포넌트 스캔 기본 대상

@Component  컴포넌트 스캔에서 사용
 @Controller 스프링 MVC 컨트롤러에서 사용
 @Service 스프링 비즈니스 로직에서 사용
@Repository 스프링 데이터 접근 계층에서 사용

 

@Componect 

:  해당 클래스를 bean으로 등록할 수 있는 어노테이션

  ( value= " " ) 로 beam의 이름 설정

  

 

basePackeges 등록

: basePackeges에 등록 되지 않은 패키지는 스캔에서 제외

  등록 된 패키지 내의 @Componenet 어노테이션을 탐색

 

 


2. excludeFilter

스캐닝에서 제외할 타입을 기술하면 해당 타입은 스캐닝에서 제외시킴

작성방법 : @ComponentScan(basePackages= " " , exbludeFilters= { @ComponenetScan.Filter( 제외시킬 값 설정 ) }

 

 

excludeFilter 설정 방법

1) 타입으로 설정

package com.greedy.section01.javaconfig.config;

import org.springframework.context.annotation.ComponentScan;

1. 타입으로 설정
@Configuration
@ComponentScan(basePackages="com.greedy.section01.javaconfig",
				excludeFilters = {
                	@ConponentScan.Filter( 
                     		type = FilterType.ASSIGNABLE_TYPE,
                            classes = { MemberDAO.class }           
                )
       })
 public class ContextConfiguration2 {

}

 

 

 

 

2) 어노테이션 종류로 설정

package com.greedy.section01.javaconfig.config;

import org.springframework.context.annotation.ComponentScan;

2. 어노테이션 종류로 설정
@Configuration
@ComponentScan(basePackages="com.greedy.section01.javaconfig",
				excludeFilters = {
                	@ConponentScan.Filter( 
                     		type = FilterType.ANNOTATION,
                            classes = {org.springframework.stereotype.Component.class}           
                )
       })
 public class ContextConfiguration2 {

}

 

 

 

 

 

3) 표현식으로 설정

package com.greedy.section01.javaconfig.config;

import org.springframework.context.annotation.ComponentScan;

3. 표현식으로 설정
@Configuration
@ComponentScan(basePackages="com.greedy.section01.javaconfig",
				excludeFilters = {
                	@ConponentScan.Filter( 
                     		type = FilterType.REGEX,
                            pattern= {"com.greedy.section01.*"} 
                            패턴안에 정규표현식을 작성할 수 있음
                )
       })
 public class ContextConfiguration2 {

}

 

 

 

sueDefaultFilters 설정 방법

: useDefaultFilters를 false로 하면 모든 어노테이션을 스캔하지 않음

  스캔할 대상 클래스만 따로 지정 가능

package com.greedy.section01.javaconfig.config;

import org.springframework.context.annotation.ComponentScan;

@Configuration
@ComponentScan(basePackages="com.greedy.section01.javaconfig",
				useDefaultFilters=false,
				includeFilters= {
						@ComponentScan.Filter(
								type=FilterType.ASSIGNABLE_TYPE,
								classes = { MemberDAO.class } MemberDAO.class만 스캔됨.
                                
						)
		})
public class ContextConfiguration3 {
	
}

 

 

 


ComponentScan 사용 예시

 

DTO

package com.greedy.section01.javaconfig;

public class MemberDTO {
	
	private int sequence;
	private String id;
	private String pwd;
	private String name;
	
	public MemberDTO() {}

	public MemberDTO(int sequence, String id, String pwd, String name) {
		super();
		this.sequence = sequence;
		this.id = id;
		this.pwd = pwd;
		this.name = name;
	}

	public int getSequence() {
		return sequence;
	}

	public void setSequence(int sequence) {
		this.sequence = sequence;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "MemberDTO [sequence=" + sequence + ", id=" + id + ", pwd=" + pwd + ", name=" + name + "]";
	}
	
	

}

 

 

 

 

basePackeges 등록

package com.greedy.section01.javaconfig.config;
import org.springframework.context.annotation.ComponentScan;

@Conriguration
@ComponentScan(basePackages="com.greedy.section01.javaconfig")
public class ContextConfiguration1 {

}

 

 

 

 

DAO interface

package com.greedy.section01.javaconfig;

public interface MemberDAO {
	
	회원 번호로 회원 정보를 조회하는 메소드
	MemberDTO selectMember(int sequence);
	
	회원 정보를 저장하고 결롸를 리턴하는 메소드
	boolean insertMember(MemberDTO newMember);	
}

 

 

 

 

DAO 상속받는 Class

package com.greedy.section01.javaconfig;

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

import org.springframework.stereotype.Component;

@Component(value="memberDAO")
public class MemberDAOImpl implements MemberDAO{
	
	private final Map<Integer, MemberDTO> memberMap;
	
	public MemberDAOImpl() {
		memberMap = new HashMap();
		
		memberMap.put(1, new MemberDTO(1, "user01", "pass01", "홍길동"));
		memberMap.put(2, new MemberDTO(1, "user02", "pass02", "유관순"));
		
	}
	
	
    매개변수로 전달 받은 회원 번호를 map에서 조회 후 회원 정보를 리턴해주는 용도의 메소드
	@Override
	public MemberDTO selectMember(int sequence) {
		return memberMap.get(sequence);
	}
	
	
	매개변수를 전달 받은 회원 정보를 map에 추가하고 성고 실패 여부를 boolean으로 리턴하는 메소드
	@Override
	public boolean insertMember(MemberDTO newMember) {
		
		int before = memberMap.size();
		
		memberMap.put(newMember.getSequence(), newMember);
		
		int after = memberMap.size();
		
		return after > before ? true : false;
	}

}

 

 

 

 출력하기 

package com.greedy.section01.javaconfig;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.greedy.section01.javaconfig.config.ContextConfiguration1;


public class Application1 {

	public static void main(String[] args) {
	
		
		ApplicationContext context = new AnnotationConfigApplicationContext(ContextConfiguration1.class);
		
        bean이름 출력용
		String[] beanNames = context.getBeanDefinitionNames(); // context 안에있는 모든 정보의 이름을 알려주세요
		
		for(String beanName : beanNames) {
			System.out.println("beanName : " + beanName);
		}
		
        bean 정보 출력용
		MemberDAO memberDAO = context.getBean(MemberDAO.class);
		
		System.out.println(memberDAO.selectMember(1));
		System.out.println(memberDAO.insertMember(new MemberDTO(3, "user03", "pass03", "새로운 멤버")));
		System.out.println(memberDAO.selectMember(3));
	}
}

출력 결과
beanName : contextConfiguration1
MemberDTO [sequence=1, id=user01, pwd=pass01, name=홍길동]
true
MemberDTO [sequence=3, id=user03, pwd=pass03, name=새로운 멤버]

 

 

 

 

xml로 ComponentScan과 filter 설정

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">

	<context:component-scan base-package="com.greedy.section02.xmlconfig"/>
		<context:exclude-filter type="assignable" expression="com.greedy.section02.xmlconfig.MemberDAO"/>
	</context:component-scan>
</beans>

 

 

반응형