一、驗證結論:
如果對象由注解注入則對象初始化時只是簡單的調用空構造函數,屬性則為默認值
如果為new()對象,賦值是什么就是什么
package com.gxb.crawler.contoller; import org.springframework.stereotype.Component; import org.springframework.stereotype.Repository; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; @RestController public class B { @Resource public A a; @GetMapping("/test") public void test1() { System.out.println(a);//如果是注解注入A對象,注意此時A的初始化 只是簡單的調用A的空構造函數,A中的屬性默認都是默認值(int是0,類屬性是null),A中的屬性如果自定義了賦值,也不會被使用。 System.out.println(a.as); System.out.println(a.aa); //a.setAa(222); //System.out.println(a.aa); //a.c.foo(); //System.out.println(a.c); a.run(); System.out.println(a.aaa); } } @Repository class A { public void setAa(int aa) { this.aa = aa; } /** * 屬性初始化的順序是在構造器之前,編譯器也會先設置默認值,然后賦予指定值 * 但是當該類的實例是spring注解的注入方式,那么被指定的值不會被賦值 */ public int aa=1;//定義到C的前面,會被先於C初始化 public String as="sdfsdf";//如果該類的對象是springMVC注解注入的方式,那么這個屬性默認是null,即使賦值,也是空 @Resource public C c ; //不會被初始化 如果 = new C(); 會先於aa和aaa初始化 // public C getC() { // return c; // } public int aaa=2;//定義到C的后面,但是 C不會被初始化 public void run(){ System.out.println("aaaaa"); c.foo(); } } @Component class C { public C() { System.out.println("C..init.."); } public void foo(){ System.out.println("cccc"); } }
執行后:

修改后;
package com.gxb.crawler.contoller; import org.springframework.stereotype.Component; import org.springframework.stereotype.Repository; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; @RestController public class B { //@Resource public A a =new A(); @GetMapping("/test") public void test1() { System.out.println(a);//如果是注解注入A對象,注意此時A的初始化 只是簡單的調用A的空構造函數,A中的屬性默認都是默認值(int是0,類屬性是null),A中的屬性如果自定義了賦值,也不會被使用。 System.out.println(a.as); System.out.println(a.aa); //a.setAa(222); //System.out.println(a.aa); //a.c.foo(); //System.out.println(a.c); //a.run(); System.out.println(a.aaa); } } @Repository class A { public void setAa(int aa) { this.aa = aa; } /** * 屬性初始化的順序是在構造器之前,編譯器也會先設置默認值,然后賦予指定值 * 但是當該類的實例是spring注解的注入方式,那么被指定的值不會被賦值 */ public int aa=1;//定義到C的前面,會被先於C初始化 public String as="sdfsdf";//如果該類的對象是springMVC注解注入的方式,那么這個屬性默認是null,即使賦值,也是空 @Resource public C c ; //不會被初始化 如果 = new C(); 會先於aa和aaa初始化 // public C getC() { // return c; // } public int aaa=2;//定義到C的后面,但是 C不會被初始化 public void run(){ System.out.println("aaaaa"); c.foo(); } } @Component class C { public C() { System.out.println("C..init.."); } public void foo(){ System.out.println("cccc"); } }
執行結果:

解開a.run()注釋
public void test1() { System.out.println(a);//如果是注解注入A對象,注意此時A的初始化 只是簡單的調用A的空構造函數,A中的屬性默認都是默認值(int是0,類屬性是null),A中的屬性如果自定義了賦值,也不會被使用。 System.out.println(a.as); System.out.println(a.aa); //a.setAa(222); //System.out.println(a.aa); //a.c.foo(); //System.out.println(a.c); a.run(); System.out.println(a.aaa); } }

結果:換為new()對象A,則A內用注解注入的C不可用
二、驗證注解方式的調用:
public void test1() { System.out.println(a);//如果是注解注入A對象,注意此時A的初始化 只是簡單的調用A的空構造函數,A中的屬性默認都是默認值(int是0,類屬性是null),A中的屬性如果自定義了賦值,也不會被使用。 System.out.println(a.as); System.out.println(a.aa); //a.setAa(222); //System.out.println(a.aa); //a.c.foo(); System.out.println(a.c); a.run(); System.out.println(a.aaa); }
執行結果:

public void test1() { System.out.println(a);//如果是注解注入A對象,注意此時A的初始化 只是簡單的調用A的空構造函數,A中的屬性默認都是默認值(int是0,類屬性是null),A中的屬性如果自定義了賦值,也不會被使用。 System.out.println(a.as); System.out.println(a.aa); //a.setAa(222); //System.out.println(a.aa); a.c.foo(); System.out.println(a.c); a.run(); System.out.println(a.aaa); }
執行結果:

結論:a.c.too()不能直接使用,因為a.c是null,可以使用GET方法
public class B { @Resource public A a; @GetMapping("/test") public void test1() { System.out.println(a);//如果是注解注入A對象,注意此時A的初始化 只是簡單的調用A的空構造函數,A中的屬性默認都是默認值(int是0,類屬性是null),A中的屬性如果自定義了賦值,也不會被使用。 System.out.println(a.as); System.out.println(a.aa); //a.setAa(222); //System.out.println(a.aa); a.getC().foo(); System.out.println(a.getC()); a.run(); System.out.println(a.aaa); } } @Repository class A { public void setAa(int aa) { this.aa = aa; } /** * 屬性初始化的順序是在構造器之前,編譯器也會先設置默認值,然后賦予指定值 * 但是當該類的實例是spring注解的注入方式,那么被指定的值不會被賦值 */ public int aa=1;//定義到C的前面,會被先於C初始化 public String as="sdfsdf";//如果該類的對象是springMVC注解注入的方式,那么這個屬性默認是null,即使賦值,也是空 @Resource public C c ; //不會被初始化 如果 = new C(); 會先於aa和aaa初始化 public C getC() { return c; } public int aaa=2;//定義到C的后面,但是 C不會被初始化 public void run(){ System.out.println("aaaaa"); c.foo(); } }
執行結果:

通過直接給屬性賦值,改變初始值
public void test1() { System.out.println(a);//如果是注解注入A對象,注意此時A的初始化 只是簡單的調用A的空構造函數,A中的屬性默認都是默認值(int是0,類屬性是null),A中的屬性如果自定義了賦值,也不會被使用。 // System.out.println(a.as); System.out.println(a.aa=1); //a.setAa(222); System.out.println(a.aa); // a.getC().foo(); // System.out.println(a.getC()); // a.run(); // System.out.println(a.aaa); }
執行結果;

使用set方法
public void test1() { System.out.println(a);//如果是注解注入A對象,注意此時A的初始化 只是簡單的調用A的空構造函數,A中的屬性默認都是默認值(int是0,類屬性是null),A中的屬性如果自定義了賦值,也不會被使用。 // System.out.println(a.as); //System.out.println(a.aa=1); a.setAa(222); System.out.println(a.aa); // a.getC().foo(); // System.out.println(a.getC()); // a.run(); // System.out.println(a.aaa); }

使用set方法賦值,不好使
