springboot 框架下對象使用時new()和注解注入的區別


一、驗證結論:

如果對象由注解注入則對象初始化時只是簡單的調用空構造函數,屬性則為默認值

如果為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方法賦值,不好使


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM