bean 자동와이어링 하기 2
애노테이션을 이용하여 자동와이어링 하기
- 스테레오타입 에노테이션을 사용하는 경우 기본 자동와이어링 방식은 byTpe이다.
- @Autowired 애노테아션과 함께 @Qualifier 애노테이션을 사용하여 bean 이름을 사용할 수 있다.
- @Lazy 애노테이션을 사용하면 처음 접근이 일어날 때 인스턴스가 생성되도록 하는 애노테이션이다.
...
@Component
@Lazy
public class TrickyTarget {
Foo fooOne;
Foo fooTwo;
Bar bar;
public TrickyTarget() [
System.out.println("TrickyTarget.constructor()");
}
public TrickyTarget (Foo foo) {
System.out.println("TrickyTarget(Foo) 호출");
}
public TrickyTarget (Foo foo, Bar bar) {
System.out.println("TrickyTarget(Foo, Bar) 호출");
}
@Autowired
public void setFooOne(Foo fooOne) {
this.fooOne = fooOne;
System.out.println("프로퍼티 fooOne 설정");
}
@Autowired
public void setFooTwo(Foo fooTwo) {
this.fooTwo = fooTwo;
System.out.println("프로퍼티 fooTwo 설정");
}
@Autowired
public void setBar(Bar bar) {
this.bar = bar;
System.out.println("프로퍼티 bar 설정");
}
public static void main(String... args) {
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
ctx.load("classpath:spring/app-context-04.xml");
ctx.refresh();
TrickyTarget t = ctx.getBean(TrickyTarget.class);
ctx.close();
}
}
/*
출력
TrickyTarget.constructor()
프로퍼티 fooOne 설정
프로퍼티 fooTwo 설정
프로퍼티 bar 설정
*/
애노테이션으로 bean 이름 지정하기
- @Component 애노테이션에 인자로 bean 이름을 전달한다.
...
@Component(“gigi”)
@Lazy
public class TrickyTarget () {
...
}
- 아래와 같이 Foo를 인터페이스로 변경하고 Foo 인터페이스를 구현한 클래스 2개를 만들면 UnsatisfiedDependencyException이 발생한다.
...
public interface Foo {
}
public class FooImpl1 implements Foo {
...
}
public class FooImpl2 implements Foo {
...
}
- @Primary 애노테이션을 사용하면 문제를 해결할 수 있으나 이는 같은 타입의 클래스가 2개인 경우까지만 해당된다.
- @Primary는 속성을 갖지 않는 마커 애노테이션이다.
...
@Component
@Primary
public class FooImpl1 implements Foo {
...
}
- 3개 이상의 동일 타입 bean을 자동와이어링하기 위해서는 @Qualifire 애노테이션에 이름을 지정하는 것이 좋다.
...
@Component(“gigi”)
@Lazy
public class TrickyTarget {
...
@Autowired
// Foo 탸입 클래스에 별도로 이름을 지정하지 않았기 때문에 이름은 클래스 이름을 사용한다.
@Qualifier("fooImpl1")
public void setFoo(Foo foo) {
this.foo = foo;
System.out.println("Property fooOne set");
}
@Autowired
@Qualifier("fooImpl2")
public void setFooTwo(Foo fooTwo) {
this.fooTwo = fooTwo;
System.out.println("Property fooTwo set");
}
...
}
자바 구성 사용하기
- 주입될 클래스는 @Component 애노테이션 대신 @Bean 애노테이션이 사용된다.
- @Bean 애노테이션이 사용되는 경우 자동으로 애노테이션이 적용된 메소드 이름이 bean 이름으로 사용된다.
...
@Configuration
static class TargetConfig {
@Bean
public Foo fooImpl1() {
return new FooImpl1();
}
@Bean
public Foo fooImpl2() {
return new FooImpl2();
}
@Bean
public Bar bar() {
return new Bar();
}
...
}