Spring 소스 코드 의 자동 조립 을 깊이 이해 하 다.

자동 조립;         Spring 은 의존 주입 (DI) 을 이용 하여 IOC 용기 의 각 구성 요소 에 대한 의존 관계 할당 을 완성 합 니 다.   1), @ Autowired: 자동 주입:         1) 기본 값 은 용기 에서 해당 하 는 구성 요 소 를 찾 습 니 다. applicationContext. getBean (BookDao. class);찾 으 면 할당         2) 같은 유형의 구성 요 소 를 여러 개 찾 으 면 속성 이름 을 구성 요소 의 id 로 용기 에서 찾 습 니 다.                             applicationContext.getBean("bookDao")          3), @ Qualifier ("bookDao"): 속성 명 대신 @ Qualifier 를 사용 하여 설치 할 구성 요소 의 id 를 지정 합 니 다.         4) 、 자동 조립 기본 값 은 반드시 속성 을 할당 해 야 합 니 다. 없 으 면 잘못 보고 합 니 다.              @ Autowired (required = false) 를 사용 할 수 있 습 니 다.         5), @ Primary: Spring 을 자동 으로 조립 할 때 기본 값 으로 선 호 하 는 bean 을 사용 합 니 다.                  @ Qualifier 에서 설치 할 bean 의 이름 을 계속 사용 할 수도 있 습 니 다.                BookService{                     @Autowired                     BookDao  bookDao;                 }      2), Spring 은 @ Resource (JSR 250) 와 @ Inject (JSR 330) [자바 규범 의 주석] 사용 도 지원 합 니 다.          @Resource:               @ Autowired 와 마찬가지 로 자동 조립 기능 을 실현 할 수 있 습 니 다. 기본 값 은 구성 요소 이름 에 따라 조립 합 니 다.              @ Primary 기능 을 지원 하지 않 고 @ Autowired (reqiured = false) 를 지원 하지 않 습 니 다.          @Inject:               javax. inject 의 가방 을 가 져 와 야 합 니 다. Autowired 의 기능 과 같 습 니 다. required = false 기능 이 없습니다.   @Autowired: Spring 이 정의 한; @ Resource, @ Inject 는 모두 자바 규범 입 니 다.         AutowiredAnnotationBeanPostProcessor: 자동 조립 기능 분석 완료;              3), @ Autowired: 구조 기, 파라미터, 방법, 속성, 모두 용기 에서 매개 변수 구성 요소 의 값 을 가 져 옵 니 다.          1), [방법 위치 에 표시]: @ Bean + 방법 매개 변수, 매개 변 수 는 용기 에서 가 져 옵 니 다. 기본적으로 @ Autowired 효 과 를 쓰 지 않 고 자동 으로 조립 할 수 있 습 니 다.          2), [구조 기 에 표시]: 구성 요소 가 하나 밖 에 없 으 면 구조 기 가 있 는 @ Autowired 는 생략 할 수 있 고 매개 변수 위치 에 있 는 구성 요 소 는 용기 에서 자동 으로 가 져 올 수 있 습 니 다.         3) 、 매개 변수 위치 에 놓 기:            4), 사용자 정의 구성 요소 가 Spring 용기 밑 에 있 는 일부 구성 요 소 를 사용 하려 고 합 니 다 (ApplicationContext, BeanFactory, xxx).                  사용자 정의 구성 요 소 는 xxxaware 를 실현 합 니 다. 대상 을 만 들 때 인터페이스 에 규정된 방법 으로 관련 구성 요 소 를 주입 합 니 다. Aware;                  Spring 바 텀 구성 요 소 를 사용자 정의 Bean 에 주입 하기;                  xxxAware: 기능 은 xxxProcessor 를 사용 합 니 다.                  ApplicationContextAware==》ApplicationContextAwareProcessor;
 
 예 를 들 어 applicationContextAware 의 전체 초기 화 과정 을 보십시오.
public class IOCTest_Autowired {
	
	@Test
	public void test01(){
		AnnotationConfigApplicationContext applicationContext = new 
            AnnotationConfigApplicationContext(MainConifgOfAutowired.class);
	
	}

}
package com.atguigu.bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.EmbeddedValueResolverAware;
import org.springframework.stereotype.Component;
import org.springframework.util.StringValueResolver;

@Component
public class AwareBean implements ApplicationContextAware,BeanNameAware,EmbeddedValueResolverAware {
	
	private ApplicationContext applicationContext;

	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		// TODO Auto-generated method stub
		System.out.println("   ioc:"+applicationContext);
		this.applicationContext = applicationContext;
	}

	@Override
	public void setBeanName(String name) {
		// TODO Auto-generated method stub
		System.out.println("  bean   :"+name);
	}

	@Override
	public void setEmbeddedValueResolver(StringValueResolver resolver) {
		// TODO Auto-generated method stub
		String resolveStringValue = resolver.resolveStringValue("   ${os.name}    #{20*18}");
		System.out.println("      :"+resolveStringValue);
	}




}

      정지점 호출 스 택 보기:
-->AnnotationConfigApplicationContext refresh();
   -->finishBeanFactoryInitialization(beanFactory); 
      -->beanFactory.preInstantiateSingletons()
        -->DefaultListableBeanFactory getBean(beanName)
          -->AbstractBeanFactory doGetBean(name, null, null, false);
            -->AbstractBeanFactory getSingleton(beanName, new ObjectFactory() 
              --> DefaultSingletonBeanRegistry singletonFactory.getObject()
                 -->AbstractBeanFactory createBean(beanName, mbd, args)
                   -->AbstractAutowireCapableBeanFactory doCreateBean(beanName, mbdToUse, args)    
                     -->AbstractAutowireCapableBeanFactory initializeBean(beanName, exposedObject, mbd)   
                       -->AbstractAutowireCapableBeanFactory applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName)
                         -->AbstractAutowireCapableBeanFactory beanProcessor.postProcessBeforeInitialization(result, beanName);
                            -->ApplicationContextAwareProcessor    invokeAwareInterfaces(bean);
                              -->ApplicationContextAwareProcessor ((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
                                -->AwareBean setApplicationContext

 
applicationContextAware Processor 의 원본 코드 를 열 어 보 니 BeanPostProcessor 사전 클래스 가 post ProcessBeforeInitialization 방법 에서 invoke Aware Interfaces 를 마지막 단계 로 호출 할 때 spring 용 기 를 설정 합 니 다.
private void invokeAwareInterfaces(Object bean) {

	if (bean instanceof Aware) {
		if (bean instanceof EnvironmentAware) {
				((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());
		}
		if (bean instanceof EmbeddedValueResolverAware) {
				((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver);
		}
		if (bean instanceof ResourceLoaderAware) {
				((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);
		}
		if (bean instanceof ApplicationEventPublisherAware) {
				((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);
		}
		if (bean instanceof MessageSourceAware) {
				((MessageSourceAware) bean).setMessageSource(this.applicationContext);
		}
		if (bean instanceof ApplicationContextAware) {
				((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
		}
	}
}

좋은 웹페이지 즐겨찾기