2012-01-25 154 views
0

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

@Singleton 
public class MySingletonBean { 

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

的问题是,辛格尔顿豆不能被实例化。任何想法?先谢谢你。

回答

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("[email protected]"); 
     member.setName("fubu"); 
     member.setPhoneNumber("453454534535"); 
     em.persist(member); 
    } 
} 

/*编辑*/

只是有一段时间想出来。该构造应该可用于DAO,因为该方法在事务中执行,并且EntityManager(在SLBService内)被正确注入。正如所期望的对其他EJB的引用尚未解决,所以要注意这一点。

相关问题