[英]Jackson deserialization: Can I inject a value with an annotation on the field of the to deserializable object?
[英]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.