반응형

 

 

 

 

 

Auto-wiring

: DI를 명시적으로 설정하지 않아도 container가 bean의 타입이나 이름을 이용하여 DI를 자동으로 수행하는 기능

 

 

XML 기반 설정

예시)

 

- byName (setter-based injection)

: property와 같은 name(또는 id) 값을 갖는 bean을 찾아 주입한다.

 

 

- byType (setter-based injection)

: property와 같은 타입을 갖는 bean을 찾아 주입한다.

단, Instrument 객체가 하나만 존재할 경우에만 쓸 수 있다.

 

 

- Constructor (constructor-based injection)

: 생성자 호출 시, argument와 같은 타입을 갖는 bean을 찾아 전달한다.

단, 해당 객체가 유일하게 존재할 경우에만 쓸 수 있다.

 

 

 

 

 

 

Auto-wiring과 명시적 설정의 혼합

자동 설정을 이용하되, 일부 preperty에 대해 명시적으로 <property>나 <constructor-arg>를 이용해 DI 설정 가능하다.

주의) 명시적 설정이 자동 설정보다 우선적으로 적용된다.

 

 

 

 

 

주의할 점

- byName, byType 방식 : 주입 가능한 bean이 없을 경우, DI 수행을 안 함

- byType, constructor 방식 : 주입 가능한 bean이 여러 개일 경우, exception 발생

(NoUniqueBeanDefinitionException)

- constructor 방식 : 자동 주입에 사용 가능한 생성자가 여러 개일 경우 exception 발생

- Auto-wiring은 다양한 타입의 bean 객체들이 다수 존재하고, 특정 타입의 bean객체가 한 개씩만 존재할 때 효과적이다.

- 그러나 객체 간의 의존 관계를 명확히 파악하기 어렵고 부작용이 발생할 위험이 있다.

 

 

 

 

참고 : 부모 Bean을 통한 설정 재사용

Bean들 사이에 중복되는 설정이 많을 경우 추상 bean을 정의하고 그 설정을 재사용(상속)

- abstract : true값을 갖는 경우, 추상 bean 생성(객체 생성 불가)

 

예1)

 

예2)

 

 

 

 

 

Java Code 기반 설정

 

@Configuration, @Bean annotation 사용

@Configuration : 이 클래스를 Spring bean의 설정 정보로 사용한다.

@Bean : 이 메서드가 생성 및 반환하는 객체를 bean 객체로 등록한다. method 이름을 bean의 id로 사용한다.

         or name 속성을 통해 bean의 id를 지정 가능하다.

 

- 생성자 기반 의존 관계 설정 (DI)

 

 

- Setter-method 기반 의존 관계 설정 (DI)

 

 

Collection Wiring

: Collection(List, Set, Map, Properties, ...) 객체 생성 및 주입

 

 

주의! 생성되는 bean들은 기본적으로 singleton 객체이다.

같은 메서드를 여러 번 호출해도 객체는 내부적으로 한 번만 생성되고 호출된다.

 

 

 

Java code 기반 설정 사용 방법

AnnotationConfigApplicationContext class를 container로 사용한다.

 

 

여러 개의 JavaConfig 클래스 사용

방법 1 :@Autowired를 이용해 설정 클래스의 객체를 주입한다.

 

 

방법 2 : @Autowired를 통해 필요한 의존 객체들을 자동 주입한다.

 

방법 3 : 모든 설정 클래스를 파라미터로 전달

 

방법 4 : @import annotation를 이용한 설정정보 결합

 

 

 

 

 

 

Annotaion 기반 설정

 

 

 

- XML 설정을 해줘야 함 !!

 

 

 

@Required

: property에 대한 setter method 앞에 사용

 

 

 

 

@Autowired

- 생성자, property, method에 대해 적용 가능

: setter 뿐만 아니라 일반 메서드에도 적용 가능

- bean들 사이의 의존 관계를 type을 이용하여 자동 설정

* 만약 할당 가능한 타입의 bean 객체가 존재하지 않을 경우, NoSuchBeanDefinitionException

* 만약 하당 가능한 타입의 bean 객체가 여러 개일 경우, NoUniqueBeanDefinitionException

 

- required 속성

: 의존 객체 주입이 반드시 필요한지 여부를 나타낸다.

: required = false로 하면 할당가능한 bean이 존재하지 않더라도 exception을 발생시키지 않는다.

 

 

 

- XML 설정

 

 

 

- Java Code 기반 설정

 

 

 

Collection Type property

원소 타입의 모든 bean을 모아서 하나의 collection 객체를 생성 및 주입한다.

 

- 주의사항

1) autowired를 property에 직접 적용할 경우, setter method가 존재하지 않아도 DI가 실행된다.

2) @Autowired를 property나 setter method, 일반 method에 적용할 경우,

Default 생성자를 통해 객체가 생성되고, 의존 객체가 주입된다.

* Default 생성자가 없고 인자가 있는 생성자가 존재할 경우 exception 발생 !

 

 

 

@Nullable

: @Autowired + @Nullable 사용시 할당 가능한 Bean이 존재하지 않는 경우 null을 주입한다.

 

 

 

@Qualifier

자동 주입 가능한 bean이 여러 개일 때, 특정 bean에 대해 한정자를 붙이거나 특정 bean을 선택하기 위해 사용한다.

 

- XML 이용 시,

 

- Java Config 이용 시,

 

 

- Bean 클래스에서 정의 시,

 

 

 

 

 

@Value

int, boolean, float, String 등의 값을 전달함

 

 

 

@Resource

: @Autowired + @Qualifier

 

 

- 주의사항

: name 속성이 생략되면 property 이름을 사용한다.(autowiring by name)

만약 이름이 같은 bean을 찾지 못하면, autowiring by type으로 전환

만약 할당 가능한 bean이 없거나 여러 개이면 exception 발생 !

 

 

 

 

 

 

참고 : JSR - 330 Annotations

 

 

 

 

 

 

 

 

 

 

Bean Scan

Annotation을 이용한 자동 bean 탐색 및 등록

1) 특정 어노테이션이 붙은 클래스에 대해 자동으로 bean을 등록하는 기능

@Component, @Controller, @Service, @Repository, @Aspect, @Configuration

속성으로 bean의 id 지정 가능, 지정하지 않았다면 클래스 이름으로(첫글자소문자) 지정

 

2) XML 또는 JavaConfig 클래스에서 명시적인 Bean 설정 생략 가능하다.

 

예시)

 

 

XML 설정 방법

<context:component-scan />

 

 

 

JavaConfig 설정 방법 : @ComponentScan

 

 

참고) beanScan 범위 설정

include-filter : 포함시킬 클래스 

exclude-filter : 제외시킬 클래스

 

 

 

 

설정 방식의 장단점

XML

장점 : 클래스들과 설정 정보를 분리할 수 있고, 관심사의 분리

단점 : 값이 모두 String 타입이므로 type-safe 하지 않음(즉 오타가 있을 때 debugging의 어려움)

 

Annotation 기반 설정 + bean scan

장점 : Java code 설정하므로 type-safe하고, 적용이 빠름

단점 : 설정이 클래스들과 결합(분산)되어 관리나 관심사의 분리가 어려움

 

Java Code 기반 설정

장점 : 클래스들과 설정을 분리할 수 있고 관심사의 분리 가능, java code로 설정하므로 type-safe

 

 

 

 

 

 

 

 

 

반응형

+ Recent posts