2011-09-13 102 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

您也可以在构造函数注入中执行相同的操作。它更加防错,因为你不能忘记依赖。 –