将无状态bean注入单例bean

时间:2012-01-25 14:35:04

标签: java singleton ejb-3.1 stateless-session-bean

我有这个要求:我有一个单例bean,我有一个用@PostConstruct注释的方法,我在那里执行一些初始化。其中一个初始化是从DB读取一些值,所以我想在这个方法中注入一个无状态bean,它是一个访问DB的服务bean。我不想将无状态bean作为单元bean中的字段注入,因为仅在此方法中需要它(在单例bean中没有其他地方)。为此,我在singleton bean中写了这个:

@Singleton
public class MySingletonBean {

    @PostConstruct
    @EJB
    public void init(SLSBService service) { /* use service to read from DB */ };
    ...
}

问题是Singleton bean无法实例化。任何的想法?提前谢谢。

1 个答案:

答案 0 :(得分:1)

由于@PostConstruct注释(回调)方法实际上是在解析了所有引用(所有注入的bean)之后调用的,所以我不认为这个构造有效。

你可以做或尝试的是删除@PostConstruct并使用普通的setter注入。但是,请注意,其他注入的资源目前尚未得到解决。

@EJB
public void setService(SLSBService service){
     service.doSmg();
}

@Stateless    
public class SLSBService{
    @PersistenceContext
    private EntityManager em;

    @TransactionAttribute(TransactionAttributeType.MANDATORY)
    public void doSmg() {
        Member member = new Member();
        member.setEmail("bla@bla.de");
        member.setName("fubu");
        member.setPhoneNumber("453454534535");
        em.persist(member);
    }
}

/ * edit * /

只是有时间尝试一下。该构造应该可用于DAO,因为该方法在事务中执行,并且EntityManager(在SLBService中)也正确注入。正如预期的对其他EJB的引用尚未解决,因此请注意这一点。