2011-09-13 121 views
0
@Named("loginDetailsService") 
public class LoginDetailsServiceImpl implements LoginDetailsService { 

    @Inject 
    @Named("loginDetailsDAO") 
    private LoginDetailsDAO loginDetailsDAO; 

    public List<UserLogin> loginDetails(UserLogin login) { 
     return loginDetailsDAO.loginDetails(login); 
    } 


public class LoginDetailsDAOImpl extends HomeSessionFactory implements LoginDetailsDAO { 


    @SuppressWarnings("unchecked") 
    @Transactional(readOnly = true) 
    public List<UserLogin> loginDetails(UserLogin login) { 
     session = sessionFactory.openSession(); 
     Query query = null; 
     try { 
       // blah... 
      } catch(Exception e){ 
     } 
     return query.list(); 
} 


public abstract class HomeSessionFactory { 

    @Inject 
    @Named("sessionFactory") 
    protected SessionFactory sessionFactory; 
    protected Session session; 
} 

彈簧上下文的文件:在一些示例彈簧3依賴注入(IOC)與註釋

<context:component-scan base-package="com.home.app" /> 

我發現,使用設定器方法loginDetailsDAO如setLoginDetailsDAO(...){..}

是否需要使用setter方法?何時需要使用getter/setter?如果我不會發生什麼事情?按照spring3.x格式,上述代碼是否需要修改?

沒有setter方法我能夠連接DAO實現。

+1

@Java:這不準確。見[我的答案](http://stackoverflow.com/questions/7408903/spring-annotation-required-to-use-setter-method/7410476#7410476)。 –

回答

0

如果你打算使用註釋 - 我強烈建議這個 - 那麼你可以註釋字段,設置者或構造函數。只有你註釋的東西是必需的。如果一個字段,它將使用反射直接在字段中設置。如果一個setter,該方法將被依賴調用。如果構造函數 - 這是我強烈建議的選項 - 那麼將使用所有適當的依賴項調用構造函數。

我強烈建議構造函數注入,因爲它使我們回到了Java中的真正的面向對象編程,其中構造函數的任務是創建一個處於有效狀態的對象。它使得類不可能在Spring中使用或者在Spring之外使用 - 尤其是在單元測試中 - 不提供所有必需的依賴關係。

0

有關使用setter方法的好處是,您可以以編程方式在單元測試中注入模擬依賴關係。這一切(至少對我而言)。

+0

您也可以在構造函數注入中執行相同的操作。它更加防錯,因爲你不能忘記依賴。 –