1.의존성 자동 주입 설정
- 컨테이너 안에 여러가지 객체들이 선언하면 메모리에 로딩되어 사용할 수 있다.
- 이 때, 서로 연관관계가 있는 객체 즉, 메서드나 필드에 선언되어 호출되는 관계의 객체들이 있다.
ex) EmpController.java
private EmpService service;
EmpService.java
private EmpDao dao;
- 컨테이너에서 autowiring 옵션을 이용하면, 객체가 현재 메모리에 로딩된 상태이기에 바로 new XXXX() 형태로 객체를 생성하여 할당없이 처리가 가능한데 이것을 의존성 자동 주입설정이라고 한다.
- 의존성 자동 주입 설정 옵션
- autowire="byType"
스프링 컨테이너 메모리가 해당 객체 타입으로 들어올 수 있는 메서드가 정의가 되어 있으면 자동으로 할당이 되게 처리하는 것을 말한다.
- autowire = "byName"
byType은 컨테이너에 들어올 수 있는 객체가 하나일 때, 처리가 가능한데 특정 객체가 여러 개 선언되어 있는 경우 byName으로 하면 일단 type이 같고 id값이 같은 property가 있는 메서드가 있을 경우 할당하는 것을 말한다.
- autowire ="constructor"
생성자를 통해서 해당 타입이 할당될 때, 자동 주입된다.
- autowire="autodetect"
우선 할당할 수 있는 생성자를 살피고, 없을 때는 기능메서드를 살펴서 byType으로 할당한다.
- autowire="no"
자동주입을 하지 못하게 한다. default값이다.
@@ di16.xml
// public void setPhone(Phone phone) 메서드를 기준으로 자동으로 할당하게 하는것이 의존성 자동주입의 개념이다.
# byType
//포함될 객체 생성
<bean id="hp02" class="a01_diexp.z01_vo.Phone" c:_0="010-3752-5329" c:_1="삼성전자"/>
//포함할 객체 생성
<bean id="us01" class="a01_diexp.z01_vo.HPUser" p:name="홍길동" autowire="byType" />
# byName
//포함될 객체 생성
<bean id="car01" class="a01_diexp.z01_vo.Car" c:_0="붕붕이" c:_1="230"/>
<bean id="car02" class="a01_diexp.z01_vo.Car" c:_0="벤츠" c:_1="320"/>
<bean id="car03" class="a01_diexp.z01_vo.Car" c:_0="BMW" c:_1="270"/>
//포함할 객체 생성
<bean id="cr01" class="a01_diexp.z01_vo.CarRacer" p:name="박사장" autowire="byName"/>
@@ CarRacer.java
// bean의 id값과 동일한 이름으로 set메서드를 생성해줘야 한다
public void setCar03(Car car) {
this.car = car;
}

2. 패키지 단위 자동 클래스 선언
- 컨테이너 설정 옵션 가운데 특정한 패키지와 각 클래스마다 선언된 annotation(@Controller/@Service/@Repository)를 기준으로 자동으로 선언하게 하여, was(tomcat)이 로딩되고, 첫번째 controller를 호출할 때, 메모리에 로딩되게 처리하는 기능을 지원한다.
- 이런 객체들의 id값은 default로 클래스명의 소문자 시작으로 자동 설정된다.
- 변경이 필요할 때는 @Controller("변경할 아이디") 형식으로 선언하면 된다.
- 기본형식 : 컨테이너 안에 선언
1) <context:component-scan base-package="적용할 최상위 패키지명">
-> 패키지 하위에 @Component로 선언된 모든 클래스는 자동으로 메모리에 로딩된다.
2) 특정 패키지에 있는 객체들을 @Component 선언없이 메모리 로딩하려면 아래의 옵션을 추가해야한다.
<context:component-scan base-package="적용할 최상위 패키지명">
<context:include-filter type="regex" expression=".*"/>
정규식표현식에 해당하는 클래스를 메모리에 로딩하는 것을 .* 하위에 있는 모든 클래스를 지칭한다.
@@ di17.xml
<context:component-scan base-package="a01_diexp.z02_vo">
</context:component-scan>
@@ a01_diexp.z02_vo.Person
@Component // @Component를 상단에 꼭 선언해줘야 컨테이너에서 인식한다.
public class Person {}
@@ di18.xml
<context:component-scan base-package="a01_diexp.z03_vo">
<context:include-filter type="regex" expression=".*"/>
</context:component-scan>
//a01_diexp.z03_vo 패키지 하위의 모든 클래스를 메모리에 저장