번개멍
[Spring]스프링의 이해? 본문
어노테이션?
생성자와 메소드 차이
.IoC 컨테이너(역제어)
-Inversion of Control : 개발자가 코드 등의 흐름이나 객체 생성에 관련된 코드를 프로그래밍에 직접
작성하는 것이 아니라, 프레임워크가 사용하는 파일에 작성하여 이를 토대로 프레임워크가 객체를 성생하고,
반환하고, 코드가 동작하는 순서를 결정하는 것을 의미합니다
-객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권을 가진다.
-IoC 컨테이너는 객체의 생성을 책임지고, 의존성을 관리합니다
-POJO의 생성, 초기화, 서비스, 소멸에 대한 권한을 가지게 됩니다
-개발자들이 직접 POJO를 생성 할 수 있지만, 컨테이너에게 맡기빈다.(Bean등록 -> xml파일)
-2가지 표현
1.의존성 건색 : DL(일반적인 데이터 처리, DataBase 연결)
2.의존성 주입: DI => Setter Injection, Constructor Injection, method Injection
각 클래스간에 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해 줍니다.
-종류
1)BeanFactory: 3.x주로 사용
-클래스를 통하여 객체를 생성하고, 이를 전달합니다
-상속 등 객체간의 관계를 형성하고 관리합니다.
-xmlBeanFactory
2)ApplicationContext
-클래스를 통하여 객체를 생성하고, 이를 전달합니다.
-상속 등 객체간의 관계를 형성하고 관리합니다
-국제화 지원 등 문자열에 대한 다양한 기능을 제공합니다
-리스너로 등록되어 있는 Bean에 이벤틀를 발생할 수 있다
-Bean에 관련한 성정을 위한 xml 파일은 즉시 로딩되어서 객체를 미리 생성하여 가지게 됩니다
-ClassPathXmlApplicationContext:xml
-FileSystemXmlApplicationContext
-xmlWebApplicationContext
Spring Bean 객체 생성하기
-spring에서는 사용할 Bean객체를 Bean configuration file에 정의하고, 필요할때마다
객체를 가져와서 사용합니다
-Bean태그: 사용할 Bean을 정의하는 태그
1)class: 객체를 생성하기 위하여 사용하는 클래스를 지정합니다(패키지명.클래스명)
2)id: Bean객체를 가져오기 위하여 사용하는 이름 지정합니다 (t1, t2 ...)
3)lazy-init: singleton인 경우에는 xml을 로딩할 때 객체생성 여부가 결정됩니다
true: xml 로딩 시에 객체를 생성하지않고, 객체를 가져올 때 생성합니다
4)scope: 객체의 범위를 설정합니다.
-singleton: 객체를 하나만 생성하여 사용합니다.
-prototype: 객체를 가져올 때마다 객체를 생성합니다.
.DI(Dependency Injection)
1)베터리 일체형: ex) 베터리가 떨어지면 장난감을 새로 구입합니다
public class CarToy{
private Battery battery;
public CarToy(){
battery = new NomalBattery();
}
}
2)베터리 분리형: ex) 베터리가 떨어지면 베터리를 교체합니다
public class CarToy{
private Battery battery;
public CarToy(){
}
public void setBattery(Battery battery){
this.battery = battery;
}
}
2-1)의미적으로는 배터리가 떨어지면 배터리만 교체합니다.라는 의미이지만 약간의 차이가 있다.
public class CarToy{
private Battery battery;
public CarToy(){
this.battery = battery;
}
public void setBattery(Battery battery){
this.battery = battery;
}
}
.DI 설정(생성자)
public StudentRegisterService(StudentDao studentDao){
this.studentDao = studentDao;
}
<bean id="studentDao" class="ezen.member.dao.studentDao/>
=> <bean id="registerService" class="ezen.member.service.StudentRegisterService>
<constructor-arg ref="studentDao"></constructor-arg>
</bean>
public StudentModifyService(StudentDao studentDao){
this.studentDao = studentDao;
}
<bean id="studentDao" class="ezen.member.dao.studentDao/>
=> <bean id="modifySerivce" class="ezen.member.service.StudentModifyService>
<constructor-arg ref="studentDao"></constructor-arg>
</bean>
public StudentDeleteService(StudentDao studentDao){
this.studentDao = studentDao;
}
<bean id="studentDao" class="ezen.member.dao.studentDao/>
=> <bean id="deleteSerivce" class="ezen.member.service.StudentDeleteService>
<constructor-arg ref="studentDao"></constructor-arg>
</bean>
public StudentSelectService(StudentDao studentDao){
this.studentDao = studentDao;
}
=> <bean id="selectService" class="ezen.member.service.StudentSelectService>
<constructor-arg ref="studentDao"></constructor-arg>
</bean>
public StudentAllSelectService(StudentDao studentDao){
this.studentDao = studentDao;
}
=> <bean id="AllSelectService" class="ezen.member.service.StudentAllSelectService>
<constructor-arg ref="studentDao"></constructor-arg>
</bean>
생성자 객체 주입
1. 의존성 주입은 스프링에서 아주 중요한 개념이며, 장점이 되는 부분입니다.
2. 빈(~.xml) 객체 생성할때, 빈 객체가 관리할 값이나 객체를 주입하는 것을 말합니다.
3. 빈 객체 생성 | 이후에는 빈 객체가 가질 기본적인 값을 자바 코드로 설정하는 것이 아니고, 빈을 정의 하는 xml 코드에서 정의하여 사용하는 것을 말합니다.
4. 빈을 정의할때 constructor-arg 태그를 이용하여 주입하면, 생성자를 통해 주입이 가능합니다.
[Sample 예제]
<bean id ="t1" class ="kr.co.ezen.beans.TestBean">
<constructor-arg value="100" type="int" index="2"/>
<constructor-arg value="str" type="String" index="2"/>
<constructor-arg value="100" type="int" index="2"/>
</bean>
<bean id="data" class="kr.co.ezen.beans.TestData" scope="prototype" />
<bean id="t2" class="kr.co.ezen.beans.TestBean2">
<constructor-arg ref="data" />
<constructor-arg ref="data" />
</bean>
5. 생성자 주입에는 다음과 같은 옵션이 존재합니다.
- value : 기본 자료형 값과 문자열의 값을 설정합니다.
- type : 저장할 데이터의 타입
- ref : 객체를 설정
- index : 지정된 값을 주입할 생성자의 매개변수의 인덱스 번호
'코딩이야기 > Spring' 카테고리의 다른 글
[Spring]AOP Interceptor (0) | 2020.07.10 |
---|---|
[Spring]Execution (0) | 2020.07.06 |
[spring]AspectJ (0) | 2020.07.06 |
[Spring] 어노테이션 정리 (0) | 2020.07.01 |
[Spring] 자동주입 (0) | 2020.06.30 |