@Component

  - <context:component-scan base-package=""/> 태그를 사용해서 스프링이 클래스를 검색할 패키지를 지정

  - <context:component-scan base-package=""/> 태그는 해당 패키지에서 @Component 어노테이션이(또는 하위 어노테이션) 적용된 클래스를 검색하여 빈으로 자동등록

  - 따라서 XML 설정 파일에 다향한 빈 정보를 추가하지 않아도 됨

 

 

AbstractServiceImpl.java

package service;

import org.springframework.stereotype.Component;

import org.springframework.stereotype.Component;

 

@Component("service01")

@Scope("prototype")
public class AbstractServiceImpl implements AbstractService {
 private String name = "111";
 
 @Override
 public String getClassName() {
  // TODO Auto-generated method stub
  return "AbstractServiceImpl-" + name;
 }

}

●//<bean id="service01" class="service.AbstractServiceImpl"></bean> 와 동일

●빈의 범위를 설정하고 싶다면 @Scope 어노테이션을 이용하면 됨

 

 

AbstractServiceImpl02.java

package service;

import org.springframework.stereotype.Component;

 

@Component("service02")
public class AbstractServiceImpl02 implements AbstractService {
 private String name = "222";
 
 @Override
 public String getClassName() {
  // TODO Auto-generated method stub
  return "AbstractServiceImpl-" + name;
 }

}

●//<bean id="service02" class="service.AbstractServiceImpl02"></bean> 와 동일

 

 

AbstractController.java

package controller;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;

import service.AbstractService;

 

@Component
public class AbstractController extends
  org.springframework.web.servlet.mvc.AbstractController {

 

 @Resource(name="service01")
 private AbstractService service;
 
 @Override
 protected ModelAndView handleRequestInternal(HttpServletRequest arg0,
   HttpServletResponse arg1) throws Exception {
  // TODO Auto-generated method stub
  
  System.out.println("START >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
  System.out.println(service.getClassName());
  System.out.println("END >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
  
  return null;
 }
}

 

spring301-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:p="http://www.springframework.org/schema/p"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.0.xsd">

 <context:annotation-config/>
 
 <context:component-scan base-package="controller"/>
 <context:component-scan base-package="service"/>
 
 <!-- HandlerMapping 설정 -->
 <bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  <property name="mappings">
   <props>
    <prop key="/abstract.sp">abstractController</prop>
   </props>
  </property>
 </bean>

 
 <!-- 각종 bean 설정 -->

 
</beans>

XML의 설정이 간결해짐.

 

 

※결과

START >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
AbstractServiceImpl-111
END >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

 

 

스프링은 기본적으로 검색된 클래스를 빈으로 등록할 때, 클래스의 이름(첫 글자는 소문자)을 빈 이름으로 사용

빈 이름을 특정이름으로 설정하고 싶다면 다음과 같이 작성 => @Component("beanName")

 

위의 예에서 만약 @Component("service01")를  @Component로 작성했다면 아래코드와 같음

<bean id="abstractServiceImpl" class="service.AbstractServiceImpl"></bean>

 

 

 

◈ 스캔 대상 클래스 범위 지정 - 필터사용

  <context:include-filter type="" expression=""/> : 자동 스캔 대상에 포함시킬 클래스
  <context:exclude-filter type="" expression=""/> : 포함시키지 않을 클래스


▶ 사용 예

 <context:component-scan base-package="service">
  <context:include-filter type="regex" expression=".*service"/>
  <context:exclude-filter type="aspectj" expression="..*service"/>
 </context:component-scan> 

 

<context:include-filter>, <context:exclude-filter> 태그는 type 속성과 expression 속성을 가짐

 

● type 속성에 올 수 있는 값

 type 속성

 설            명

 annotation

 클래스에 지정한 어노테이션이 적용됐는지의 여부. expression 속성에는 "org.example.SomeAnnotation"와 같이 어노테이션 이름을 입력

 assignable  클래스가 지정한 타입으로 할당 가능한지의 여부. expression 속성에는 "org.example.SomeClass"와 같이 타입 이름을 입력
 regex

 클래스 이름이 정규 표현식에 매칭되는 지의 여부. expression 속성에는 "org.example.Default.*"와 같이 정규 표현식을 입력

 aspectj

 클래스 이름이 AspectJ의 표현식에 매칭되는 지의 여부. expression 속성에는 "org.example..*Service+"와 같이 AspectJ의 표현식을 입력

 

 

 

[참고자료] Spring 3.0 프로그래밍-최범균 

'프로그램 > Spring 3.0' 카테고리의 다른 글

@Configuration, @Bean - 2(@ImportResource)  (0) 2012.04.26
@Configuration, @Bean - 1  (0) 2012.04.25
@PostConstruct, @PreDestroy  (0) 2012.04.25
@Resource  (0) 2012.04.24
@Autowired  (2) 2012.04.24

+ Recent posts