【问题标题】:Injecting a bean inside another bean and use it in the constructor?在另一个bean中注入一个bean并在构造函数中使用它?
【发布时间】:2015-12-10 10:50:02
【问题描述】:

我有一个看起来像这样的 bean:

@Component
@Scope("session")
public class AlarmChartSettingsBean implements Serializable {
...

在这个 bean 中,我像这样注入另一个 bean:

@Inject
private SessionInfoBean sessionInfoBean;

然后我在第一个 bean 的构造函数中调用注入的 bean,如下所示:

public AlarmChartSettingsBean() {

    String atcaIp = sessionInfoBean.getNwConfigBean().getAtcaIP();
}

问题是注入的bean是空的。所以问题是那个bean是什么时候注入的?我可以在构造函数中使用它还是在构建 bean 之后使用它?

【问题讨论】:

  • 只有在有实例的情况下才能将 bean 注入到 bean 中。所以它在构造函数中不可用。

标签: spring constructor dependency-injection managed-bean


【解决方案1】:

在 Spring 有机会自动装配任何字段之前调用 Spring bean 的构造函数。这就解释了为什么 sessionInfoBean 在构造函数中是 null

如果你想初始化一个 Spring bean,你可以:

  • @PostConstruct注释方法:

    @PostConstruct
    public void init() {
        String atcaIp = sessionInfoBean.getNwConfigBean().getAtcaIP();
    }
    
  • 实现InitializingBean并在afterPropertiesSet方法中编写初始化代码:

    public class AlarmChartSettingsBean implements Serializable, InitializingBean {
    
        @Override
        void afterPropertiesSet() {
            String atcaIp = sessionInfoBean.getNwConfigBean().getAtcaIP();
        }
    
    }
    

【讨论】:

  • AFAIK 你也可以自动装配构造函数。
  • @PeterRader 是的,这是可能的。有很多可能的解决方案,列出它们需要很长时间
【解决方案2】:

字段上的@Inject 将在构造函数被调用后自动装配。

注意:在某些 Spring-Apps 中,@Inject 可能不起作用,请改用@Autowire

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多