[Spring Technology] Spring Architecture
[Spring Technology] Spring IOC 및 DI 진입 사례
[Spring Technology] Spring Bean 구성 및 예제
[Spring Technology] Spring Dependency Injection(DI 구성)
[Spring Technology] Spring Third-Party 리소스 구성 관리
[Spring Technology] ] Spring Container Technology
[Spring Technology] Spring Annotation 개발
[Spring Technology] Spring Integration Mybatis&Junit Unit Test
[Spring Technology] Spring AOP
[Spring Technology] Spring Transaction Management
Spring Bean의 구성 및 예제
먼저 Bean의 기본 구성
문제 수입
질문 1: <bean> 태그에서 별칭을 구성하는 방법은 무엇입니까?
질문 2: Bean의 기본 범위는 무엇입니까? 수정하는 방법?
1. 빈 기본 설정 [key]
구성 지침
코드 데모
"IOC 시작하기 사례" applicationContext.xml 구성 참조
연산 결과
"IOC 시작하기 사례" 실행 결과 보기
2. 빈 별칭 설정
구성 지침
코드 데모
인쇄 결과
3. Bean 범위 구성 [키]
구성 지침
확장자: scope의 값은 싱글톤, 프로토타입 뿐만 아니라 request, session, application, websocket 등으로 생성된 객체가 웹 컨테이너(tomcat)의 해당 위치에 위치함을 나타냅니다. 예: 요청은 요청 도메인에 저장하는 것을 의미합니다.
코드 데모
인쇄 결과
마지막으로 설명하겠습니다. 실제 개발에서 대부분의 빈은 싱글톤입니다. 즉, 대부분의 빈은 범위 속성으로 구성할 필요가 없습니다.
둘, 빈 인스턴스화
문제 수입
얼마나 많은 방법으로 Bean을 인스턴스화할 수 있습니까?
1. Bean 생성 방법
빈은 본질적으로 객체이며 빈 생성은 생성자를 사용하여 수행됩니다.
2. Bean을 인스턴스화하는 세 가지 방법
2.1 시공방법 [키]
- BookDaoImpl 구현 클래스
public class BookDaoImpl implements BookDao {
public BookDaoImpl() {
System.out.println("book dao constructor is running ....");
}
public void save() {
System.out.println("book dao save ...");
}
}
- applicationContext.xml 배치
<!--方式一:构造方法实例化bean-->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
- AppForInstanceBook 테스트 클래스
public class AppForInstanceBook {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
}
}
- 연산 결과
참고: 매개 변수가 없는 생성자가 없으면 예외가 발생합니다.BeanCreationException
2.2 정적 팩토리 방식
- OrderDao 인터페이스 및 OrderDaoImpl 구현 클래스
public interface OrderDao {
public void save();
}
public class OrderDaoImpl implements OrderDao {
public void save() {
System.out.println("order dao save ...");
}
}
- OrderDaoFatory 공장 클래스
//静态工厂创建对象
public class OrderDaoFactory {
public static OrderDao getOrderDao(){
System.out.println("factory setup....");
return new OrderDaoImpl();
}
}
- applicationContext.xml 배치
<!--方式二:使用静态工厂实例化bean-->
<bean id="orderDao" class="com.itheima.factory.OrderDaoFactory" factory-method="getOrderDao"/>
- AppForInstanceOrder 테스트 클래스
public class AppForInstanceOrder {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
OrderDao orderDao = (OrderDao) ctx.getBean("orderDao");
orderDao.save();
}
}
- 연산 결과
2.3 인스턴스 팩토리 방식
- UserDao 인터페이스 및 UserDaoImpl 구현 클래스
public interface UserDao {
public void save();
}
public class UserDaoImpl implements UserDao {
public void save() {
System.out.println("user dao save ...");
}
}
- UserDaoFactory 팩토리 클래스
//实例工厂创建对象
public class UserDaoFactory {
public UserDao getUserDao(){
return new UserDaoImpl();
}
}
- applicationContext.xml 배치
<!--方式三:使用实例工厂实例化bean-->
<bean id="userFactory" class="com.itheima.factory.UserDaoFactory"/>
<bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>
- AppForInstanceUser 테스트 클래스
public class AppForInstanceUser {
public static void main(String[] args) {
// //创建实例工厂对象
// UserDaoFactory userDaoFactory = new UserDaoFactory();
// //通过实例工厂对象创建对象
// UserDao userDao = userDaoFactory.getUserDao();
// userDao.save();
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) ctx.getBean("userDao");
userDao.save();
}
}
- 연산 결과
2.4 FactoryBean<T> 메소드 구현
- UserDaoFactoryBean을 정의하여 FactoryBean<UserDao> 구현
UserDaoFactoryBean에서 인스턴스화된 객체 제네릭의 유형이 유형입니다.
//FactoryBean创建对象
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
//代替原始实例工厂中创建对象的方法
public UserDao getObject() throws Exception {
return new UserDaoImpl();
}
public Class<?> getObjectType() {
return UserDao.class;
}
}
- applicationContext.xml 배치
<!--方式四:使用FactoryBean实例化bean-->
<bean id="userDao" class="com.itheima.factory.UserDaoFactoryBean"/>
이전 AppForInstanceUser 테스트 클래스를 사용하여 실행하고 결과를 확인하십시오. 구성 파일에서 id="userDao"가 반복되는지 주의하십시오.
3. 빈 생명주기
문제 수입
질문 1: 다중 인스턴스 Bean이 파괴 방법을 구성하고 실행할 수 있습니까?
질문 2: Bean 파괴 방법을 구현하는 방법은 무엇입니까?
1. 생명주기 관련 개념 소개
- 생명주기: 창조에서 죽음까지의 전체 과정
- 빈 생명주기: 생성에서 소멸까지 빈의 전반적인 과정
- Bean 수명 주기 제어: Bean이 생성된 후 소멸되기 전에 작업을 수행합니다.
2. 코드 데모
2.1 빈 생명주기 제어
- 수명 주기 제어 방법 제공
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save ...");
}
//表示bean初始化对应的操作
public void init(){
System.out.println("init...");
}
//表示bean销毁前对应的操作
public void destory(){
System.out.println("destory...");
}
}
- applicationContext.xml 배치
<!--init-method:设置bean初始化生命周期回调函数,此处填写init方法名-->
<!--destroy-method:设置bean销毁生命周期回调函数,仅适用于单例对象,此处填写destory方法名-->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/>
- 테스트 클래스
public class AppForLifeCycle {
public static void main( String[] args ) {
//此处需要使用实现类类型,接口类型没有close方法
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
//关闭容器,执行销毁的方法
ctx.close();
}
}
2.2 빈 생명주기 제어
- InitializingBean, DisposableBean 인터페이스 구현
public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {
private BookDao bookDao;
public void setBookDao(BookDao bookDao) {
System.out.println("set .....");
this.bookDao = bookDao;
}
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
public void destroy() throws Exception {
System.out.println("service destroy");
}
public void afterPropertiesSet() throws Exception {
System.out.println("service init");
}
}
테스트 클래스 코드는 "3.2.1 Bean Lifecycle Control"의 테스트 코드와 동일하다.
3. 콩 파괴 타이밍
- 컨테이너 종료 전에 빈 파괴 트리거
- 컨테이너를 닫으려면:
- 컨테이너
ConfigurableApplicationContext
인터페이스close()
작업을 수동으로 닫습니다. - 종료 후크를 등록하고 가상 머신이 종료되기 전에 컨테이너를 닫은 다음 가상 머신
ConfigurableApplicationContext
인터페이스registerShutdownHook()
작업을 종료합니다.
- 컨테이너
public class AppForLifeCycle {
public static void main( String[] args ) {
//此处需要使用实现类类型,接口类型没有close方法
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
//注册关闭钩子函数,在虚拟机退出之前回调此函数,关闭容器
ctx.registerShutdownHook();
//关闭容器
//ctx.close();
}
}