簡體   English   中英

如何通過注釋注入對象並在此對象上設置屬性值

[英]How to inject an object via annotation and set an attribute value on this object

我正在使用@Resource批注注入工作正常的對象。 但是我想在這個注入的對象上設置一個屬性,但是我不確定是否可以使用注釋來實現。

例如,我有Test類,它使用@Resource批注注入了MyClass的實例。 MyClass有一個屬性myAttribute ,我想在注入MyClass實例時設置它。

有人知道這是否可能嗎?

您應該使用javax.annotation@PostConstruct批注:

public class Test {
    @Resource
    private MyClass myClass;

    @PostConstruct
    public void init() {
       myClass.setMyAttribute("test-class");
    }
}

public class AnotherTest {
    @Resource
    private MyClass myClass;

    @PostConstruct
    public void init() {
       myClass.setMyAttribute("another-test-class");
    }
}

在Spring初始化您的對象之后(即,所有依賴項都已注入),然后將調用此方法。

我假設MyClass不是Singleton。

如果確定在運行時不會有多個依賴項或替代MyClass實例,則可以通過StuPointerException使用解決方案。 但是如果Test和AnotherTest都存在於單個應用程序上下文中,則由於spring bean的單例默認范圍,AnotherTest初始化也會影響Test的狀態。
這是因為@Resource會將相同的bean注入兩個所有者bean中。

為了防止這種情況,您應該通過同一類創建不同的bean。 這需要xml配置或JavaConfig。 由於您喜歡這里的注釋,因此它是:

@Configuration
public class AppConfig { 

    @Bean
    public MyClass myClass1() {
        MyClass myClass = new MyClass();
        myClass.setMyAttribute("attr-value-1");
        return myClass;
    }

    @Bean
    public MyClass myClass2() {
        MyClass myClass = new MyClass();
        myClass.setMyAttribute("attr-value-2");
        return myClass;
    }

}

然后,您可以像以前一樣使用@Resource自動接線,但在每種情況下都使用不同的bean

public class Test {
    @Resource("myClass1")
    private MyClass myClass;    
}

public class AnotherTest {
    @Resource("myClass2")
    private MyClass myClass;
}

帶彈簧的DI:

@Autowired
MyClass myClass

使用Java-ee:

@Inject
MyClass myClass

關於帶注釋的屬性注入,您仍然可以查看@Value ,但是您需要一個屬性文件

暫無
暫無

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

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