특정 어노테이션이 붙은 클래스를 자동으로 찾아서 Bean으로 등록해주는 방식
컴포넌트의 스테레오 타입 <bean>
태그와 동일한 역할
영속성을 가지는 속성을 가진 클래스(파일, DB)
비즈니스 로직 가진 클래스
프레젠테이션 레이어에서 사용
웹 어플리케이션에서 요청 응답을 처리하는 클래스
<property>
<constructor-arg>
와 동일한 역할@Value("Spring")
= <property ~ value="Spring">
@Autowired
와 같이 사용됨@Autowired
가 타입을 이용한 주입을 하기 때문에@Component
를 통해 자동으로 Bean 등록하고 @Autowired
로 의존관계를 주입받는 어노테이션을 클래스에서 선언해서 사용했을 경우 해당 클래스가 위치한 특정 패키지를 Scan하기 위한 설정이 필요하다
<context:component-scan base-package="myspring.di.annot />"
자동 스캔 대상에 포함시킬 클래스와 포함시키지 않을 클래스 구체적 명시하는 태그
StringPrinter.java
@Component("stringPrinter") // id가 stringPrinter인 Bean으로 사용하겠다!
public class StringPrinter implements Printer {
}
Hello.java
package myspring.di.annot;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class Hello {
@Value("Spring")
private String name;
@Autowired // Printer
@Qualifier("stringPrinter") // Printer타입이 2개기 때문에 불러올 클래스 명시해줌
private Printer printer;
List<String> names;
public Hello() {
}
public Hello(String name, Printer printer) {
this.name = name;
this.printer = printer;
}
/*
* Setter가 없어도 인젝션 가능
* public void setNames(List<String> names) { this.names = names; }
*
* public void setName(String name) { this.name = name; }
*
* public void setPrinter(Printer printer) { this.printer = printer; }
*/
public List<String> getNames() {
return names;
}
public String sayHello() {
// TODO Auto-generated method stub
return "Hello " + name;
}
public void print() {
this.printer.print(sayHello());
}
}
annot.xml
<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="myspring.di.annot"></context:component-scan>
</beans>
HelloBeanAnnotTest.java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:config/annot.xml")
public class HelloBeanAnnotTest {
@Autowired
ApplicationContext context;
@Test
public void test() {
Hello hello = context.getBean("hello",Hello.class);
assertEquals("Hello Spring", hello.sayHello());
}
}
value.properties
myname=Spring
myprinter=printer
value1=AOP
value2=Spring
value3=DI
printer1=stringPrinter
printer2=consolePrinter
Hello.java
public class Hello {
@Value("${myname}") // value.properties 활용위해 $ 사용
private String name;
@Resource(name="${printer1}") // value.properties 활용 시 사용
private Printer printer;
}
annot.xml
<!-- properties 파일 사용을 위해 추가해야함 -->
<context:property-placeholder location="classpath:config/value.properties"/>