如何通过注释注入对象并在此对象上设置属性值

时间:2014-11-04 14:09:41

标签: java spring dependency-injection annotations

我使用@Resource注释来注入一个正常工作的对象。但是我想在这个注入的对象上设置一个属性,我不确定这是否可以使用注释。

例如,我有一个类Test,它使用MyClass注释注入@Resource个实例。 MyClass有一个属性myAttribute,我想在注入MyClass实例时设置该属性。

有人知道这是否可行?

3 个答案:

答案 0 :(得分:0)

您应该使用来自@PostConstruct的{​​{1}}注释:

javax.annotation

然后在Spring初始化对象后调用此方法(即已注入所有依赖项)。

我假设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"); } } 不是单身人士。

答案 1 :(得分:0)

如果您确定在运行时不能拥有多个依赖项或备用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;
}

答案 2 :(得分:-1)

DI with Spring:

@Autowired
MyClass myClass

使用Java-ee:

@Inject
MyClass myClass

关于带注释的属性注入,您仍然可以查看@Value,但是您需要一个属性文件