2011-09-13 21 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; 
} 

Springコンテキストファイルを使用していくつかの例では、私はそのsetLoginDetailsDAO(...)としてloginDetailsDAOの設定メソッドを使用して、{..}スプリング3依存性注入(IOC)注釈

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

を発見しました

セッターメソッドを使用する必要がありますか? getter/setterを使用する必要があるとき私は何が起こるのだろうか? spring3.x形式のように、上記のコードに必要な変更はありますか?

セッターメソッドなしDAO実装に接続できます。

+1

@ジャバ:それは正確ではありません。 [私の答え](http://stackoverflow.com/questions/7408903/spring-annotation-required-to-use-setter-method/7410476#7410476)を参照してください。 –

答えて

0

アノテーションを使用する場合は、これを強くお勧めします。次に、フィールド、セッター、またはコンストラクタに注釈を付けることができます。注釈を付けるものだけが必要です。フィールドの場合は、リフレクションを使用してフィールドに直接設定されます。セッターの場合、そのメソッドは依存関係を持って呼び出されます。コンストラクタ(これが私が強く推奨するオプション)であれば、コンストラクタはすべての適切な依存関係で呼び出されます。

コンストラクタインジェクションを強くお勧めします。なぜなら、コンストラクタインジェクションは、オブジェクトを有効な状態で作成するというJavaの実際のオブジェクト指向プログラミングに戻るからです。必要な依存関係をすべて提供することなく、クラスがSpringの内外で、特に単体テストで使用することは不可能です。

0

setterメソッドを使用するといいのは、単体テストでモック依存関係をプログラムで挿入できることです。それはすべてです(私にとっては少なくとも)。

+0

コンストラクタインジェクションでも同じことができます。あなたが依存関係を忘れることはできないので、それはさらに誤りを防ぎます。 –