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);
}
}
결실총결산
자,이상 이 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.