Spring Bean의 구성 및 예제

여기에 이미지 설명 삽입

[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

먼저 Bean의 기본 구성

문제 수입

질문 1: <bean> 태그에서 별칭을 구성하는 방법은 무엇입니까?

질문 2: Bean의 기본 범위는 무엇입니까? 수정하는 방법?

1. 빈 기본 설정 [key]

구성 지침

이미지-20210729183500978

코드 데모

"IOC 시작하기 사례" applicationContext.xml 구성 참조

연산 결과

"IOC 시작하기 사례" 실행 결과 보기

2. 빈 별칭 설정

구성 지침

이미지-20210729183558051

코드 데모

이미지-20210729191924626

인쇄 결과

이미지-20210729191954870

3. Bean 범위 구성 [키]

구성 지침

이미지-20210729183628138

확장자: scope의 값은 싱글톤, 프로토타입 뿐만 아니라 request, session, application, websocket 등으로 생성된 객체가 웹 컨테이너(tomcat)의 해당 위치에 위치함을 나타냅니다. 예: 요청은 요청 도메인에 저장하는 것을 의미합니다.

코드 데모

이미지-20210729192420048

인쇄 결과

이미지-20210729192730871

마지막으로 설명하겠습니다. 실제 개발에서 대부분의 빈은 싱글톤입니다. 즉, 대부분의 빈은 범위 속성으로 구성할 필요가 없습니다.

둘, 빈 인스턴스화

문제 수입

얼마나 많은 방법으로 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();
    }
}
  • 연산 결과

이미지-20210729194137151

참고: 매개 변수가 없는 생성자가 없으면 예외가 발생합니다.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"/>

이미지-20210729195248948

  • AppForInstanceOrder 테스트 클래스
public class AppForInstanceOrder {
    
    
    public static void main(String[] args) {
    
    
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        OrderDao orderDao = (OrderDao) ctx.getBean("orderDao");

        orderDao.save();
    }
}
  • 연산 결과

이미지-20210729195009198

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"/>

이미지-20210729200203249

  • 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();
    }
}
  • 연산 결과

이미지-20210729200240820

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();
    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_51808107/article/details/130311669
Recomendado
Clasificación