spring 불러오는 프로그램의 몇 가지 방법 소개

4185 단어 spring로드
스프링 용기에서 bean을 초기화하고 제거하기 전에 하는 작업 정의 방법은 세 가지가 있습니다.
첫 번째: 메모 @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가 지정한 방법을 호출하지 않습니다.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기