목차
Bean 범위 및 수명 주기
Bean 범위
Bean Scope Classification
singleton
prototype
request
참고: SpringMVC에서만 사용 가능 ⽤
Spring 执行流程
生命周期演示
Java java지도 시간 Java의 Spring Bean 범위 및 라이프사이클에 대한 심층 분석 및 소스 코드 분석

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

May 08, 2023 pm 07:04 PM
java spring bean

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    본 웹사이트의 성명
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

    핫 AI 도구

    Undresser.AI Undress

    Undresser.AI Undress

    사실적인 누드 사진을 만들기 위한 AI 기반 앱

    AI Clothes Remover

    AI Clothes Remover

    사진에서 옷을 제거하는 온라인 AI 도구입니다.

    Undress AI Tool

    Undress AI Tool

    무료로 이미지를 벗다

    Clothoff.io

    Clothoff.io

    AI 옷 제거제

    AI Hentai Generator

    AI Hentai Generator

    AI Hentai를 무료로 생성하십시오.

    뜨거운 도구

    메모장++7.3.1

    메모장++7.3.1

    사용하기 쉬운 무료 코드 편집기

    SublimeText3 중국어 버전

    SublimeText3 중국어 버전

    중국어 버전, 사용하기 매우 쉽습니다.

    스튜디오 13.0.1 보내기

    스튜디오 13.0.1 보내기

    강력한 PHP 통합 개발 환경

    드림위버 CS6

    드림위버 CS6

    시각적 웹 개발 도구

    SublimeText3 Mac 버전

    SublimeText3 Mac 버전

    신 수준의 코드 편집 소프트웨어(SublimeText3)

    자바의 완전수 자바의 완전수 Aug 30, 2024 pm 04:28 PM

    Java의 완전수 가이드. 여기서는 정의, Java에서 완전 숫자를 확인하는 방법, 코드 구현 예제에 대해 논의합니다.

    자바의 웨카 자바의 웨카 Aug 30, 2024 pm 04:28 PM

    Java의 Weka 가이드. 여기에서는 소개, weka java 사용 방법, 플랫폼 유형 및 장점을 예제와 함께 설명합니다.

    Java의 스미스 번호 Java의 스미스 번호 Aug 30, 2024 pm 04:28 PM

    Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

    Java Spring 인터뷰 질문 Java Spring 인터뷰 질문 Aug 30, 2024 pm 04:29 PM

    이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

    Java 8 Stream foreach에서 나누거나 돌아 오시겠습니까? Java 8 Stream foreach에서 나누거나 돌아 오시겠습니까? Feb 07, 2025 pm 12:09 PM

    Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

    Java의 날짜까지의 타임스탬프 Java의 날짜까지의 타임스탬프 Aug 30, 2024 pm 04:28 PM

    Java의 TimeStamp to Date 안내. 여기서는 소개와 예제와 함께 Java에서 타임스탬프를 날짜로 변환하는 방법에 대해서도 설명합니다.

    캡슐의 양을 찾기위한 Java 프로그램 캡슐의 양을 찾기위한 Java 프로그램 Feb 07, 2025 am 11:37 AM

    캡슐은 3 차원 기하학적 그림이며, 양쪽 끝에 실린더와 반구로 구성됩니다. 캡슐의 부피는 실린더의 부피와 양쪽 끝에 반구의 부피를 첨가하여 계산할 수 있습니다. 이 튜토리얼은 다른 방법을 사용하여 Java에서 주어진 캡슐의 부피를 계산하는 방법에 대해 논의합니다. 캡슐 볼륨 공식 캡슐 볼륨에 대한 공식은 다음과 같습니다. 캡슐 부피 = 원통형 볼륨 2 반구 볼륨 안에, R : 반구의 반경. H : 실린더의 높이 (반구 제외). 예 1 입력하다 반경 = 5 단위 높이 = 10 단위 산출 볼륨 = 1570.8 입방 단위 설명하다 공식을 사용하여 볼륨 계산 : 부피 = π × r2 × h (4

    Spring Tool Suite에서 첫 번째 Spring Boot 응용 프로그램을 실행하는 방법은 무엇입니까? Spring Tool Suite에서 첫 번째 Spring Boot 응용 프로그램을 실행하는 방법은 무엇입니까? Feb 07, 2025 pm 12:11 PM

    Spring Boot는 강력하고 확장 가능하며 생산 가능한 Java 응용 프로그램의 생성을 단순화하여 Java 개발에 혁명을 일으킨다. Spring Ecosystem에 내재 된 "구성에 대한 협약"접근 방식은 수동 설정, Allo를 최소화합니다.

    See all articles