>  기사  >  Java  >  Java의 Spring Bean 범위 및 라이프사이클에 대한 심층 분석 및 소스 코드 분석

Java의 Spring Bean 범위 및 라이프사이클에 대한 심층 분석 및 소스 코드 분석

WBOY
WBOY앞으로
2023-05-08 19:04:06767검색

Bean 범위 및 수명 주기

Bean 범위

Bean의 범위는 전체 Spring 프레임워크에서 Bean의 특정 동작 모드를 나타냅니다.

예를 들어 싱글톤 싱글톤 범위는 Bean이 전체 Spring One 복사본에서 하나의 범위만 갖는다는 것을 의미합니다. , 전역적으로 공유되므로 다른 사람이 값을 수정하면 다른 사람이 읽는 값이 수정된 값입니다.

Bean Scope Classification

  • singleton: 싱글톤 범위(기본 범위)

  • prototype: 프로토타입 범위 (다중 인스턴스 범위)

  • request: 요청 범위

  • session: 콜백 범위

  • application: 전역 범위

  • websocket: HTTP

# 참고# 마지막 네 가지 상태는 값입니다. ​Spring MVC에서는

singleton

Bean은 기본적으로 싱글턴 상태입니다. 즉, 이전에 싱글턴 패턴을 배웠을 때 모두가 동일한 객체를 사용하고 있습니다. 싱글톤을 사용하면 성능이 크게 향상될 수 있다는 것을 모두가 알고 있으므로 Spring의 Bean 범위도 기본적으로 싱글톤 패턴입니다.

  • Description: IoC 컨테이너의 이 범위에는 Bean 인스턴스가 하나만 있습니다. 즉, 획득한 Bean(applicationContext.getBean 및 기타 메서드를 통해 획득)과 조립된 Bean(즉, @를 통해 주입)입니다. Autowired)는 동일한 객체입니다.

  • 시나리오: 일반적으로 Stateless Bean은 이 범위를 사용합니다(Stateless는 Bean 객체의 속성 상태를 업데이트할 필요가 없음을 의미합니다)

prototype
  • 설명: 각각 이 범위 내에서 Bean 요청은 새 인스턴스를 생성합니다. Bean을 얻는 것(즉, applicationContext.getBean 및 기타 메소드를 통해 얻는 것)과 Bean을 조립하는 것(즉, @Autowired 주입을 통해)은 모두 새로운 객체 인스턴스입니다.

  • 시나리오: 일반적으로 Stateful Bean은 이 범위를 사용합니다.

request
  • 설명: 각 http 요청은 프로토타입과 유사한 새 Bean 인스턴스를 생성합니다

  • 시나리오: http 요청에 대한 ⼀번 공유 Bean and response

  • 참고: SpringMVC에서 사용하도록 제한됨 대화에 응답하는 공유 Bean, 예: 사용자의 로그인 정보 기록

참고: SpringMVC에서만 사용 가능 ⽤
  • 애플리케이션(이해)
  • 설명: http 서블릿 컨텍스트에서 Bean 인스턴스 정의
  • 시나리오: 웹 애플리케이션의 컨텍스트 정보(예: 애플리케이션의 공유 정보 기록

참고: SpringMVC로만 제한됨 ⽤

    사용)
  • websocket (이해)
  • Description: HTTP WebSocket의 라이프 사이클에서 Bean 인스턴스를 정의합니다.
  • Scenario: WebSocket의 각 세션에서 Map 구조의 헤더 정보가 래핑에 저장됩니다. 미래 헤드의 클라이언트 메시지. 첫 번째 초기화 이후 WebSocket이 끝날 때까지 동일한 Bean입니다.

Remarks: Spring WebSocket에서만 사용 가능 ⽤

  • 싱글톤 범위(싱글톤) VS 전역 범위(애플리케이션)
  • singleton은 Spring Core의 범위, 애플리케이션은 Spring Web Scope의 범위 .
  • 싱글턴은 IoC 컨테이너에서 작동하고, 애플리케이션은 서블릿 컨테이너에서 작동합니다.

Bean 범위 설정

  • @Scope 태그는 메소드 또는 클래스를 수정할 수 있으며, @Scope에는 두 가지 설정이 있습니다. ⽅Form

  • 열거 사용 설정: @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
  • @Component
    public class UserBeans {
      	@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
        @Bean
        public User user1() {
            User user = new User();
            user.setId(1);
            user.setName("Gujiu");
            user.setPassword("123456");
            return user;
        }
    }

    값을 직접 설정: @Scope("prototype")

    @Component
    public class UserBeans {
        @Scope("prototype")
        @Bean
        public User user1() {
            User user = new User();
            user.setId(1);
            user.setName("Gujiu");
            user.setPassword("123456");
            return user;
        }
    }
  • Spring 실행 프로세스

컨테이너 시작 (스타트업 프로젝트)

구성 파일 읽기(초기화)@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

//@Component
public class BeanLifeComponent implements BeanNameAware {

    @Override
    public void setBeanName(String s) {
        System.out.println("执行了通知");
    }

    @PostConstruct
    public void postConstruct() {
        System.out.println("执行了 @PostConstruct");
    }

    public void init() {
        System.out.println("执行了 init-method");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println("执行了销毁方法");
    }
}

直接设置值: @Scope("prototype")

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="myComponent" class="com.demo.component.BeanLifeComponent"
          init-method="init" ></bean>
</beans>

Spring 执行流程

  • 启动容器 (启动项目)

  • 读取配置文件 (初始化)

    • 使用 xml 直接注册 Bean

    • 配置 Bean 根 (扫描) 路径

  • 将 Bean 存储到 Spring 中: 通过类注解进行扫描和装配

  • 将 Bean

    xml를 사용하여 Bean에 직접 등록

    구성 >Bean 루트(스캔) 경로

      Spring에 Bean 저장: 클래스 주석을 통해 스캔 및 어셈블
    • Bean은 필수 클래스(fetch 작업)
    • Bean 라이프 사이클
    • 소위 라이프 사이클은 객체의 탄생부터 소멸까지의 전체 수명 과정을 의미합니다. 우리는 이 과정을 객체의 라이프 사이클이라고 부릅니다. 🎜🎜🎜Bean 수명 주기: 🎜🎜🎜🎜Bean 인스턴스화(JVM의 "로딩"에 해당, 처음부터 시작, 바이트 코드를 메모리의 객체로 변환, 메모리 할당만 함) [러프 하우스 세트 구입]🎜🎜🎜🎜속성 설정 (콩 주입 및 조립) [장식 재료 구입(외부 자원 소개)]🎜🎜🎜🎜콩 초기화 [집 꾸미기]🎜
      • 实现了各种 Aware 通知的方法,如 BeanNameAware、BeanFactoryAware、ApplicationContextAware 的接口方法 [打电话给各个装修的师傅]

      • 执行 BeanPostProcessor 初始化前置方法 [师傅勘察环境, 指定装修方案 (前置工作)]

      • 执行 @PostConstruct 初始化方法,依赖注入操作之后被执行 [两类装修师傅进行装修]

      • 执行自己指定的 init-method 方法 (如果有指定的话) [两类装修师傅进行装修]

      • 执行 BeanPostProcessor 初始化后置方法 [装修之后的清理工作]

    • 使用 Bean [房子可以入住使用了]

    • 销毁 Bean [卖掉房子]

    生命周期演示

    BeanLifeComponent 类:

    //@Component
    public class BeanLifeComponent implements BeanNameAware {
    
        @Override
        public void setBeanName(String s) {
            System.out.println("执行了通知");
        }
    
        @PostConstruct
        public void postConstruct() {
            System.out.println("执行了 @PostConstruct");
        }
    
        public void init() {
            System.out.println("执行了 init-method");
        }
    
        @PreDestroy
        public void preDestroy() {
            System.out.println("执行了销毁方法");
        }
    }

    xml 配置:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:content="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    
        <bean id="myComponent" class="com.demo.component.BeanLifeComponent"
              init-method="init" ></bean>
    </beans>

    调用类:

    public class App2 {
        public static void main(String[] args) {
            ClassPathXmlApplicationContext applicationContext =
                    new ClassPathXmlApplicationContext("spring-config.xml");
            BeanLifeComponent beanLifeComponent =
                    applicationContext.getBean("myComponent", BeanLifeComponent.class);
            System.out.println("使用Bean");
            applicationContext.destroy();
        }
    }

    运行结果展示:

    Java의 Spring Bean 범위 및 라이프사이클에 대한 심층 분석 및 소스 코드 분석

    위 내용은 Java의 Spring Bean 범위 및 라이프사이클에 대한 심층 분석 및 소스 코드 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제