簡體   English   中英

@Value 注解在傳入方法的參數時如何注入值?

[英]How does @Value annotation inject values when passed in parameters of a method?

我是 Spring 新手,我正在使用 @Value 注釋,發現它可以應用於字段或構造函數/方法參數,但是當我嘗試使用參數注入值時,它沒有為我的參數注入值,我將值設為null

我在下面方法的參數中使用了@Value

public void setName(@Value("Adventure of War") String name) {
        System.out.println("Setting Company Name");
        this.name = name;
}

完整代碼(Company.java)

package gd.rf.anuragsaini.stereotype;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class Company {
    String name;
    String motive;

    public void setName(@Value("Adventure of War") String name) {
        System.out.println("Setting Company Name");
        this.name = name;
    }

    public void setMotive(@Value("A place for War") String motive) {
        System.out.println("Setting Company Motive");
        this.motive = motive;
    }

    @Override
    public String toString() {
        return "Company{" +
                "name='" + name + '\'' +
                ", motive='" + motive + '\'' +
                '}';
    }
}

主文件(App.java)

package gd.rf.anuragsaini.stereotype;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext IOC = new ClassPathXmlApplicationContext("config.xml");
        Company c1 = IOC.getBean("company", Company.class);
        System.out.println(c1);
    }
}

輸出

Company{name='null', motive='null'}

這樣setter 就不會被調用。在構造Company 類型的bean 時,frameWork 默認使用Company 類的默認構造函數。

因此,您應該為 setter 使用@Autowired以保證在構造這些 bean 時框架將調用 setter

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class Company {
    String name;
    String motive;

    @Autowired
    public void setName(@Value("Adventure of War") String name) {
        System.out.println("Setting Company Name");
        this.name = name;
    }

    @Autowired
    public void setMotive(@Value("A place for War") String motive) {
        System.out.println("Setting Company Motive");
        this.motive = motive;
    }

    @Override
    public String toString() {
        return "Company{" + "name='" + name + '\'' + ", motive='" + motive + '\'' + '}';
    }
}

輸出 :

Company{name='Adventure of War', motive='A place for War'}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM