Spring 에서 Bean 의 생명주기 와 작용 역 및 실현 방식 을 상세히 해석 하 다

머리말
applicationContext.xml 에 bean 을 설정 한 후 Bean 의 성명 주기 상 태 는 어떤 것 입 니까?생명주기 의 각 단 계 는 무엇 을 할 수 있 습 니까?applicationContext.xml 에서 bean 의 역할 영역 을 설정 하 는 데 어떤 것 이 있 습 니까?그 중 각 작용 역 이 대표 하 는 것 은 무엇 입 니까?어떤 상황 에 적용 되 는가?이 문장 은 기록 을 하나 한다.
라 이 프 사이클
초기 화
Spring Bean Life Cycle

위의 그림 에서 보 듯 이 빈 초기 화 완료 에는 9 단계 가 포함 된다.그 중에서 일부 절 차 는 인터페이스의 실현 을 포함 하 는데 그 중에서 BeanNameAware 인터페이스,BeanFactory Aware 인 터 페 이 스 를 포함한다.응용 프로그램 ContextAware 인터페이스.BeanPostProcessor 인터페이스,InitialingBean 인터페이스.그렇다면 이 인터페이스 들 은 전체 생명주기 단계 에서 어떤 역할 을 합 니까?뒤에 하나씩 소개 하 겠 습 니 다.
실례 화 전
Bean 의 모든 속성 설정 이 완료 되면 특정한 행 위 를 수행 해 야 합 니 다.Spring 은 두 가지 방식 으로 이 기능 을 실현 합 니 다.
init-mothod 를 사용 하 는 방법initializingBean 인터페이스 실현초기 화 방법 지정
다음 과 같다.

package com.model;
public class InitBean {
 public static final String NAME = "mark";
 public static final int AGE = 20;
 
 public InitBean() {
 // TODO Auto-generated constructor stub
 System.out.println("      ");
 }
 
 public String name;
 public int age ;
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 public int getAge() {
 return age;
 }
 public void setAge(int age) {
 this.age = age;
 }
 
 public void init(){
 System.out.println("  init            ");
 this.name = NAME;
 this.age = AGE;
 System.out.println("     ");
 }
}
컴 파 일 러

package com.model;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.service.UserServiceImpl;
public class Main {
 public static void main(String[] args) { 
 ApplicationContext context = new ClassPathXmlApplicationContext("initbean.xml");
 InitBean bean = (InitBean) context.getBean("init");
 }
}
Bean 설정
init-method 인자 주의

<?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:p="http://www.springframework.org/schema/p"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 <bean id="init" class="com.model.InitBean" init-method="init"/>
</beans>
실행 결과

InitialingBean 인터페이스 구현
InitializingBean 인 터 페 이 스 를 실현 하면 after PropertiesSet 방법 이 실 현 됩 니 다.이 방법 은 자동 으로 호출 됩 니 다.하지만 이 방식 은 침입 적 이다.일반적으로 사용 을 권장 하지 않 습 니 다.
after PropertiesSet 방법 실현

package com.model;
import org.springframework.beans.factory.InitializingBean;
public class InitBean implements InitializingBean {
 public static final String NAME = "mark";
 public static final int AGE = 20;
 
 public InitBean() {
 // TODO Auto-generated constructor stub
 System.out.println("      ");
 }
 
 public String name;
 public int age ;
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 public int getAge() {
 return age;
 }
 public void setAge(int age) {
 this.age = age;
 }
 
 public void init(){
 System.out.println("  init            ");
 this.name = NAME;
 this.age = AGE;
 System.out.println("     ");
 }
 @Override
 public void afterPropertiesSet() throws Exception {
 // TODO Auto-generated method stub
 System.out.println("  init            ");
 this.name = NAME;
 this.age = AGE;
 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:p="http://www.springframework.org/schema/p"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 <!-- <bean id="init" class="com.model.InitBean" init-method="init"/> -->
 <bean id="init" class="com.model.InitBean" init-method="init"/>
</beans>
결과:

소각 하 다

마찬가지 로 위의 그림 은 빈 이 소각 할 때의 과정 을 나타 낸다.Disposable Bean 인터페이스 포함.
destroy-method 방법 사용 하기

package com.model;
import org.springframework.beans.factory.InitializingBean;
public class InitBean implements InitializingBean {
 public static final String NAME = "mark";
 public static final int AGE = 20;
 
 public InitBean() {
 // TODO Auto-generated constructor stub
 System.out.println("      ");
 }
 
 public String name;
 public int age ;
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 public int getAge() {
 return age;
 }
 public void setAge(int age) {
 this.age = age;
 }
 
 public void init(){
 System.out.println("  init            ");
 this.name = NAME;
 this.age = AGE;
 System.out.println("     ");
 }
 @Override
 public void afterPropertiesSet() throws Exception {
 // TODO Auto-generated method stub
 System.out.println("  init            ");
 this.name = NAME;
 this.age = AGE;
 System.out.println("     ");
 }
 
 public void close(){
 System.out.println("bean   ");
 }
}
Bean 설정

<?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:p="http://www.springframework.org/schema/p"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 <!-- <bean id="init" class="com.model.InitBean" init-method="init"/> -->
 <bean id="init" class="com.model.InitBean" destroy-method="close"/>
</beans>
로 더 설정

package com.model;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.service.UserServiceImpl;
public class Main {
 public static void main(String[] args) { 
 AbstractApplicationContext context = new ClassPathXmlApplicationContext("initbean.xml");
 context.registerShutdownHook();
 InitBean bean = (InitBean) context.getBean("init");
 }
}
결과:

DisposableBean 인터페이스 구현
DisposableBean 인터페이스 구현

package com.model;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
public class InitBean implements InitializingBean,DisposableBean {
 public static final String NAME = "mark";
 public static final int AGE = 20;
 
 public InitBean() {
 // TODO Auto-generated constructor stub
 System.out.println("      ");
 }
 
 public String name;
 public int age ;
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 public int getAge() {
 return age;
 }
 public void setAge(int age) {
 this.age = age;
 }
 
 public void init(){
 System.out.println("  init            ");
 this.name = NAME;
 this.age = AGE;
 System.out.println("     ");
 }
 @Override
 public void afterPropertiesSet() throws Exception {
 // TODO Auto-generated method stub
 System.out.println("  init            ");
 this.name = NAME;
 this.age = AGE;
 System.out.println("     ");
 }
 
 public void close(){
 System.out.println("bean   ");
 }
 @Override
 public void destroy() throws Exception {
 // TODO Auto-generated method stub
 System.out.println("bean     ");
 }
}
프로필

<?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:p="http://www.springframework.org/schema/p"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 <!-- <bean id="init" class="com.model.InitBean" init-method="init"/> -->
 <!-- <bean id="init" class="com.model.InitBean" destroy-method="close"/> -->
 <bean id="init" class="com.model.InitBean"/>
</beans>

Spring Bean 의 역할 영역
역할 영역
묘사 하 다.
singleton
이 역할 영역 은 모든 Spring IoC 용기 의 단일 인 스 턴 스(기본 값)로 bean 의 정 의 를 제한 합 니 다.
prototype
이 역할 영역 은 단일 bean 의 정 의 를 임의의 수량의 대상 인 스 턴 스 로 제한 합 니 다.
request 
이 도 메 인 은 bean 의 정 의 를 HTTP 요청 으로 제한 합 니 다.웹-aware Spring Application Context 의 컨 텍스트 에서 만 유효 합 니 다.
session
이 역할 영역 은 bean 의 정 의 를 HTTP 세 션 으로 제한 합 니 다.웹-aware Spring Application Context 의 컨 텍스트 에서 만 유효 합 니 다.
global-session
이 역할 영역 은 bean 의 정 의 를 전역 HTTP 세 션 으로 제한 합 니 다.웹-aware Spring Application Context 의 컨 텍스트 에서 만 유효 합 니 다.
설정 예제

<bean id="..." class="..." scope="singleton">
</bean>
사용 방법 은 조화 작용 영역 이 다른 Bean 을 주입 합 니 다.
정상 적 인 상황 에서 singleton 역할 영역 이 singleton 역할 영역 에 의존 하면.매번 얻 는 것 은 같은 대상 이다.마찬가지 로 prototype 역할 영역 은 prototype 역할 영역 에 의존 하고 매번 얻 는 것 은 새로운 대상 입 니 다.그러나 singleton 이 prototype 역할 영역 에 의존 하면 매번 가 져 오 는 singleton 의 prototype 은 처음으로 만 든 prototype 입 니 다.어떻게 이런 관 계 를 조율 합 니까?매번 얻 는 게 옳 을 거 라 고 약속 하 는 군.
이런 상황 에 대해 스프링 은 이런 문 제 를 해결 하기 위해 lookup 방법 을 제공 했다.
우선 원형 을 정의 합 니 다.

package com.model;
public class MyHelper {
 public void doSomethingHelpful() {
 
 }
}
그리고 인 터 페 이 스 를 통 해 주입:

package com.model;
public interface DemoBean {
 MyHelper getHelper();
 void somePeration();
}
하나의 예 설정:

package com.model;
/**
 *    
 * @author kevin
 *
 */
public abstract class AbstractLookupDemo implements DemoBean {
 
 public abstract MyHelper getMyHelper();
 
 @Override
 public MyHelper getHelper() {
 // TODO Auto-generated method stub
 return getMyHelper();
 }
 
 @Override
 public void somePeration() {
 // TODO Auto-generated method stub
 
 }
}
프로필:

<?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:p="http://www.springframework.org/schema/p"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  <bean id="helper" class="com.model.MyHelper" scope="prototype"/>
  <bean id="standardLookupBean" class="com.model.StandardLookupDemo">
  <property name="myHelper" ref="helper"></property>
  </bean>
  <bean id = "abstractLookupBean" class="com.model.AbstractLookupDemo">
  <lookup-method name="getMyHelper" bean="helper"></lookup-method>
  </bean>
</beans>
프로필 불 러 오기:

package com.model;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.util.StopWatch;
public class Main {
 public static void main(String[] args) {
 
 AbstractApplicationContext context = new ClassPathXmlApplicationContext("lookBean.xml");
 context.registerShutdownHook();
 System.out.println("  standardLookupBean");
 test(context, "standardLookupBean");
 System.out.println("  AbstractLookupDemo");
 test(context, "abstractLookupBean");
 }
 
 public static void test(AbstractApplicationContext context,String beanName) {
 DemoBean bean = (DemoBean) context.getBean(beanName);
 MyHelper helper1 = bean.getHelper();
 MyHelper helper2 = bean.getHelper();
 System.out.println("  "+beanName);
 System.out.println("  helper    ?"+(helper1==helper2));
 StopWatch stopWatch = new StopWatch();
 stopWatch.start("lookupDemo");
 for (int i = 0; i < 10000; i++) {
 MyHelper helper = bean.getHelper();
 helper.doSomethingHelpful();
 }
 stopWatch.stop();
 System.out.println("  10000    "+stopWatch.getTotalTimeMillis()+"  ");
 }
}
결과:

위의 결과 도 를 보면 예전 의 방식 으로 생 성 된 대상 은 매번 같다.lookup 방식 으로 매번 다른 것 을 주입 합 니 다.이런 문 제 를 해결 할 수 있다.하지만 더 쉬 운 방법 이 있 는 지,이런 방식 의 장점 을 귀 찮 게 느낀다.
Bean 에 게 Spring 용 기 를 감지 하도록 하 겠 습 니 다.
BeanNameAware 를 실현 하고 id 값 을 설정 합 니 다.
BeanFactory Aware,Application ContextAware 감지 Spring 용 기 를 실현 합 니 다.Spring 용기 가 져 오기.
Spring 국제 화 지원
프로필 설정

<?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:p="http://www.springframework.org/schema/p"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
  <property name="basenames">
   <list>
   <value>message</value>
   </list>
  </property>
  </bean>
</beans>
새 중국어 프로필
message_zh_CN.properties:

hello=welcome,{0}
now=now is : {0}
새 영문 프로필
message_en_US.properties:

hello=\u4F60\u597D,{0}
now=\u73B0\u5728\u7684\u65F6\u95F4\u662F : {0}
프로필 불 러 오기

package com.model;
import java.util.Date;
import java.util.Locale;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.util.StopWatch;
public class Main {
 public static void main(String[] args) {
 ApplicationContext context = new ClassPathXmlApplicationContext("globalization.xml");
 String[] a = {"  "};
 String hello = context.getMessage("hello",a, Locale.CHINA);
 Object[] b = {new Date()};
 String now = context.getMessage("now",b, Locale.CHINA);
 System.out.println(hello);
 System.out.println(now);
 hello = context.getMessage("hello",a, Locale.US);
 now = context.getMessage("now",b, Locale.US);
 System.out.println(hello);
 System.out.println(now);
 }
}
결실

총결산
자,이상 이 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기