2012-01-25 66 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的引用尚未解決,所以要注意這一點。

相關問題