이 기사는 주로 Spring Bean Loading Execution Order의 관련 내용을 다음과 같이 연구합니다.
문제의 원천 :
A와 B 인 Bean이 있습니다. A가 인스턴스화되면 B의 반환 값에 대한 방법 funb에 속성 이름을 할당하려고합니다.
방금 작성된 경우 :
private B b;
private String name = b.funb();
오류 가보고되고 NullPointException은 현재 B가 설정되지 않았으므로 NULL입니다.
솔루션은 다음 코드와 같습니다. 동시에, 초기화의 실행 순서, 객체 구성 방법 및 봄에 초과 방법을 배우십시오.
공개 클래스 A는 초기화를 구현 {private b b; private String 이름; // = b.funb (); public void setb (b b) {System.out.println ( "a.setb 초기화"); this.b = b;} public a () {system.out.println ( "a initialed");} public void init () {system.out.println ( "init"); this.name = b.funb ();}@public string toString () {return super.toString () + this.name;} public void afterProperTiesset () 예외 {// 사실, 여기에 넣을 수도 있습니다 // this.name = b.funb (); System.out.println ( "AfterProperTiesset");}} public class b {public string funb () {system.out.println ( "funb"); return "b.funb";} public b () {system.out.println ( "b initered");}}스프링 구성 파일
<beans default-autowire = "byname"> <bean id = "a"init-method = "init"> </bean> <bean id = "b"> </bean> </beans>
테스트 코드 :
public static void main (String [] args) {ApplicationContext context = new FileSystemXmlApplicationContext ( "Src/TestSpring/bean.xml"); a = (a) context.getBean ( "a"); System.out.println (a);}프로그램 출력은 다음과 같습니다.
초기
b 초기
A. 세트가 초기화되었습니다
AfterPropertiesset
이니
펀브
[email protected]
여기에서 Bean이로드 될 때 A의 이름 속성이 B의 Funb 메소드의 반환 값으로 성공적으로 설정되어 있음을 알 수 있습니다. 핵심 요점은 초기 방법을 사용하여 구현하는 것입니다.
로딩 순서는 다음과 같은 것으로 볼 수 있습니다.
첫 번째 생성자 -> 그런 다음 B 설정 메소드 주입 -> 초기화 AfterProperTiesset 메소드 -> 초기 방법 메소드
다음 내용은이 책에서 발췌 한 것이지만, 한 번 발췌하더라도 그 내용에 대한 나의 이해가 더 심도있을 것임을 알았습니다!
1. 스프링 어셈블리 콩의 과정
1. 인스턴스화;
2. 속성 값을 설정하십시오.
3. Beannameaware 인터페이스가 구현되면 SetBeanName을 호출하여 Bean ID 또는 이름을 설정하십시오.
4. BeanFactoryAware 인터페이스를 구현하는 경우 SetBeanFactory를 호출하여 BeanFactory를 설정하십시오.
5. ApplicationContextAware가 구현되면 SetApplicationContext를 호출하여 ApplicationContext를 설정하십시오.
6. BeanPostProcessor의 사전 시작 방법을 호출하십시오.
7. AfterProperTiesset () 초기화 비를 호출하십시오.
8. 사용자 정의 된 초기 방법 메소드를 호출하십시오.
9. BeanPostProcessor의 이니티브 화 방법에 전화하십시오.
스프링 컨테이너 종료 프로세스
1. Call Rishposablebean Destroy ();
2. 맞춤형 파괴 방법 방법을 호출하십시오.
1. 단일 콩
짐
1. 인스턴스화;
2. 속성 값을 설정하십시오.
3. Beannameaware 인터페이스가 구현되면 SetBeanName을 호출하여 Bean ID 또는 이름을 설정하십시오.
4. BeanFactoryAware 인터페이스를 구현하는 경우 SetBeanFactory를 호출하여 BeanFactory를 설정하십시오.
5. ApplicationContextAware가 구현되면 SetApplicationContext를 호출하여 ApplicationContext를 설정하십시오.
6. BeanPostProcessor의 사전 시작 방법을 호출하십시오.
7. AfterProperTiesset () 초기화 비를 호출하십시오.
8. 사용자 정의 된 초기 방법 메소드를 호출하십시오.
9. BeanPostProcessor의 이니티브 화 방법에 전화하십시오.
스프링 컨테이너가 닫힙니다
1. Call Rishposablebean Destroy ();
2. 맞춤형 파괴 방법 방법을 호출하십시오.
2. 여러 콩의 순서
BeanPostProcessor 구현 Bean의 로딩 우선 순위를 정합니다
콩 정의 순서대로, 콩의 적재 순서 (여러 스프링 파일을로드 할 때 ID 덮어 쓰기가 있더라도)
"속성 값을 설정"(2 단계) 인 경우, 심판을 만나면 Ref의 ID에 해당하는 Bean이 "Instantiation"(1 단계) 후에 먼저로드됩니다.
AbstractFactoryBean의 서브 클래스는 6 단계 이후의 CreateInstance 메소드를 호출 한 다음 GetObjectType 메소드가 호출됩니다.
BeanFactoryUtils 클래스는 또한 콩의 하중 순서를 변경합니다.
위는 스프링 콩 로딩의 구현 순서에 대한이 기사의 모든 내용이며, 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!