spring 불러오는 프로그램의 몇 가지 방법 소개
첫 번째: 메모 @PostConstruct 및 @PreDestroy 방법으로 bean을 초기화하고 제거하기 전에 수행한 작업
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class DataInitializer{
@PostConstruct
public void initMethod() throws Exception {
System.out.println("initMethod ");
}
@PreDestroy
public void destroyMethod() throws Exception {
System.out.println("destroyMethod ");
}
}
두 번째는 xml에서 init-method와destory-method 방법을 정의하는 것이다
public class DataInitializer{
public void initMethod() throws Exception {
System.out.println("initMethod ");
}
public void destroyMethod() throws Exception {
System.out.println("destroyMethod ");
}
}
<bean id="dataInitializer" class="com.somnus.demo.DataInitializer" init-method="initMethod" destory-method="destroyMethod"/>
세 번째는 bean을 통해 Initializing Bean과 Disposable Bean 인터페이스 구현
import org.springframework.beans.factory.DisposableBean;
public class DataInitializer implements InitializingBean,DisposableBean{
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet ");
}
@Override
public void destroy() throws Exception {
System.out.println("destroy ");
}
}
그 중에서 첫 번째와 두 번째는 같은 형식이다. 단지 xml 설정일 뿐이고 다른 하나는 주해 형식일 뿐이다. 큰 차이가 있는 것은 세 번째이다. 만약에 같은 bean이 두 가지 방식으로 초기화할 때 어떤 방법을 집행하면 먼저 집행 순서에 나타난다.afterPropertiesSet () 를 먼저 실행하고 initMethod () 를 실행합니다.
여기 원본 좀 볼게요.
이 방식은spring에서 어떻게 실현되었습니까?
스프링의 불러오는 bean의 원본 클래스(Abstract Autowire Capable BeanFactory)를 보면 그 중의 오묘함을 알 수 있다
Abstract Autowire Capable BeanFactory 클래스의 invoke InitMethods는 다음과 같이 명확하게 설명합니다.
protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd)
throws Throwable {
// bean InitializingBean , InitializingBean , bean afterPropertiesSet
boolean isInitializingBean = (bean instanceof InitializingBean);
if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
if (logger.isDebugEnabled()) {
logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
}
if (System.getSecurityManager() != null) {
try {
AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
public Object run() throws Exception {
// afterPropertiesSet
((InitializingBean) bean).afterPropertiesSet();
return null;
}
},getAccessControlContext());
} catch (PrivilegedActionException pae) {
throw pae.getException();
}
}
else {
// afterPropertiesSet
((InitializingBean) bean).afterPropertiesSet();
}
}
if (mbd != null) {
String initMethodName = mbd.getInitMethodName();
// init-method , init-method , init-method
if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
!mbd.isExternallyManagedInitMethod(initMethodName)) {
// , init-method
invokeCustomInitMethod(beanName, bean, mbd);
}
}
요약:1:spring은 bean에 두 가지 초기화 bean 방식을 제공합니다. InitializingBean 인터페이스를 실현하고afterPropertiesSet 방법을 실현하거나 프로필에서 init-method와 지정한 두 가지 방식을 동시에 사용할 수 있습니다.
2: InitializingBean 인터페이스를 실현하는 것은 afterPropertiesSet 방법을 직접 호출하는 것으로 반사를 통해 init-method가 지정한 방법보다 효율이 상대적으로 높다.그러나 init-method 방식은spring에 대한 의존을 없앴다
3: afterPropertiesSet 방법을 호출하는 중 오류가 발생하면 init-method가 지정한 방법을 호출하지 않습니다.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.