220114 자바 스프링 프레임워크 - 설정 및 구현
설정 및 구현
11강 생명주기(Life Cycle)
11-1 : 스프링 컨테이너 생명주기
main클래스에서
- 스프링 컨테이너 생성: GenericXmlApplicationContext를 이용해서 스프링 컨테이너 초기화(생성)
GenericXmlApplicationContext ctx =
new GenericXmlApplicationContext("classpath:appCtx.xml");
- getBean()를 이용한 빈(Bean)객체 이용
BookRegisterService bookRegisterService =
ctx.getBean("bookRegisterService", BookRegisterService.class);
- close()를 이용한 스프링 컨테이너 종료
ctx.close();
** 스프링 설정 파일에서 자동주입을 해주기 위해 appCtx.xml에 <context:annotation-config /> 등록한다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config />
<bean id="bookDao" class="com.brms.book.dao.BookDao"/>
<bean id="bookRegisterService" class="com.brms.book.service.BookRegisterService"/>
<bean id="bookSearchService" class="com.brms.book.service.BookSearchService"/>
<bean id="memberDao" class="com.brms.member.dao.MemberDao"/>
<bean id="memberRegisterService" class="com.brms.member.service.MemberRegisterService"
init-method="initMethod" destroy-method="destroyMethod"/>
<bean id="memberSearchService" class="com.brms.member.service.MemberSearchService"/>
</beans>
** 인터페이스 혹은 bean의 속성 이용은 개인 취향차이다.
11-2 : 빈(Bean) 객체 생명주기
빈(Bean)객체의 생명주기는 스프링 컨테이너의 생명주기와 같이 함
해당하는 bean객체가 생성되는 시점과 소멸될때 특정한 작업을 할 수 있는 방법
1. interface 이용
2. 속성을 이용해서 속성값과 똑같은 method를 만들어줌(메모리에서 객체가 빠져나갈때 소멸된다고 함)
public class BookRegisterService implements InitializingBean, DisposableBean {
@Autowired
private BookDao bookDao;
public BookRegisterService() { }
public void register(Book book) {
bookDao.insert(book);
}
@Override
public void afterPropertiesSet() throws Exception { //InitializingBean에서 나옴
System.out.println("bean 객체 생성");
}
@Override
public void destroy() throws Exception { //DisposableBean에서 나옴
System.out.println("bean 객체 소멸");
}
}
11-3 : init-method, destroy-method 속성
public class BookRegisterService {
@Autowired
private BookDao bookDao;
public BookRegisterService() { }
public void register(Book book) {
bookDao.insert(book);
}
public void initMethod() { //생성시점
System.out.println("BookRegisterService 빈(Bean)객체 생성 단계");
}
public void destroyMethod() { //소멸시점
System.out.println("BookRegisterService 빈(Bean)객체 소멸 단계");
}
}
12-1강 어노테이션을 이용한 스프링 설정 - 1
12-1-1 : XML파일을 Java파일로 변경하기
스프링 파일을 XML이 아닌 java파일에서 어노테이션으로 설정하는 방법
//xml을 대신해서 스프링설정파일로서 스프링 설정파일을 생성할 수 있다고 명시해줘야함
//그게 바로 @Configuration
@Configuration
public class MemberConfig {
//xml파일에 <bean id="studentDao" class="ems.member.dao.StudentDao" ></bean>을 자바에서 구현
@Bean //bean객체를 만들어주겠다
public StudentDao studentDao() {
return new StudentDao();
}
// xml에서는
// <bean id="registerService" class="ems.member.service.StudentRegisterService">
// <constructor-arg ref="studentDao" ></constructor-arg>
// </bean>
@Bean
public StudentRegisterService registerService() {
return new StudentRegisterService(studentDao()); //생성자 parameter에 StudentDao()호출
}
/* xml에서는
<bean id="dataBaseConnectionInfoDev" class="ems.member.DataBaseConnectionInfo">
<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="userId" value="scott" />
<property name="userPw" value="tiger" />
</bean> */
@Bean
public DataBaseConnectionInfo dataBaseConnectionInfoDev() {
DataBaseConnectionInfo infoDev = new DataBaseConnectionInfo();
infoDev.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:xe");
infoDev.setUserId("scott");
infoDev.setUserPw("tiger");
return infoDev;
}
......
12-2강 어노테이션을 이용한 스프링 설정 - 2
12-2-1 : Java 파일 분리
- 일반적으로 파일을 분리할 때는 기능별로 분류한다.
- 구분 단위는 서비스와 관련된 Dao, 서비스 기능이 모여있는 service, db관련, util들 이런식으로 함
- 한 클래스에 다 모여있었는데 여러 클래스에 기능별로 구분해서 분리함
@Configuration
public class MemberConfig3 {
@Autowired
DataBaseConnectionInfo dataBaseConnectionInfoDev; //자동으로 의존설정(MemberConfig2로부터 생성된 객체가 MemberConfig3에 자동으로 주입됨)
@Autowired
DataBaseConnectionInfo dataBaseConnectionInfoReal; //자동으로 의존설정(MemberConfig2로부터 생성된 객체가 MemberConfig3에 자동으로 주입됨)
.....
- 컨테이너는 딱 하나이고, 그 곳에 모든 Bean객체가 생성된다. 위처럼 MemberConfig3에서 MemberConfig2의 메소드를 호출해야할때, 객체를 일단 만들어주고, Autowired를 이용해서 MemberConfig3에 주입해주고 사용하면 된다.
12-2-2 : @Import 어노테이션
@Configuration
@Import({MemberConfig2.class, MemberConfig3.class})
public class MemberConfig1 {