'Spring' IOC와 DI
IOC (Inversion of Control) 제어 역행
인스턴스의 생명주기 관리를 개발자가 아닌 컨테이너가 처리
개발자가 필요할 때마다 객체를 생성하는 것이 아니라 객체를 만들어 놓고 그것을 가져와서 사용하는 방식
*ApplicationContext를 가장 많이 사용
BeanFactory와 달리 context를 사용하기 전에 모든 bean을 로딩하여 바로 사용할 수 있도록 함
ApplicationContext context = new ClassPathXmlApplicationContext("file_name.xml"); Object obj = (Object)context.getBean("xml_object_name"); obj.setMethed(value);
DI (Dependency Inject) 의존 주입 (사용자가 IOC한 것을 사용하는 방법)
클래스 간의 의존관계 (결합도)를 줄이며 외부(컨테이너)에서 생성한 객체를 필요한 곳에 사용
프로그램 코드에서 직접 빈을 획득할 필요 없으며 Container가 자체적으로 필요한 객체를 넘겨줌
xml을 이용한 방식
<bean><bean/>태그를 등록할 때마다 객체가 하나 생성
id: bean 클래스를 식별하기 위한 이름
name: id 속성과 동일
class: 패키지경로.클래스명
*id와 name의 차이
설정될 수 있는 값, id 속성은 자바 명명 규치 따름
*singleton pattern으로 객체를 생성하므로 하나의 객체를 생성하여 재사용
Constructor Injection (생성자 주입)
10
Setter Injection (메서드 주입)
*집합연관: 상대방에 대해서 선택적 관계이면 집합 ex)차량의 CD 플레이어
복합연관: 한 객체는 다른 객체에 소유되는 개념 ex)자동차의 엔진이나 타이어
DI 자동 주입
xml 파일이 너무 커지는 것을 방지
스프링이 알아서 의존 객체를 찾아서 주입
xml파일에 <context:annotation-config/> 설정 추가
*자바1.5는 어노테이션 사용 불가
build path의 resource를 자바1.8 버전으로 변경
의존주입대상에 @Autowired 또는 @Resource 설정
@Autowired
생성자나 메소드, 필드 변수에 @Autowired 어노테이션을 지정
동작순서: type형 비교를 통해서 주입할 객체를 찾는다
*해당 type의 객체가 1개만 있는 경우 id 정보를 확인하지 않고 바로 주입
@Resource
변수와 메소드에만 사용 가능 (생성자에 사용 불가능)
동작순서: @AutoWired와 반대로 id 정보를 우선 확인
component-scan
지정된 패키지 하위의 모든 패키지를 스캔하여 빈으로 등록
<context:component-scan base-package="kr.co.패키지명"/>
빈으로 등록되려면 하위의 모든 패키지를 스캔하여 빈으로 등록
@Controller, @Service, @Repository(name="named"),
@Component("nameRegister")
4가지 중 하나를 선택하여 사용하되 Component로 정의해도 됨
이름을 정의할 때는 클래스명의 앞을 소문자로 적어준다
어노테이션 정의 한 것을 <bean id="boardVO">