繁体   English   中英

Spring 3带有注释的依赖注入(IoC)

[英]spring 3 Dependency injection( IoC) with annotation

@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;  
}

春天的上下文文件:

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

在某些示例中,我发现使用setter方法将loginDetailsDAO用作setLoginDetailsDAO(...){..}

是否需要使用setter方法? 什么时候需要使用getter / setter? 如果我不怎么办? 按照spring3.x格式,上述代码是否需要任何修改?

没有设置方法,我能够连接DAO实现。

使用setter方法的好处是,您可以以编程方式在单元测试中注入模拟依赖项。 仅此而已(至少对我而言)。

如果您要使用批注-我强烈建议这样做-那么您可以批注字段,设置器或构造函数。 只需要添加注释的内容即可。 如果是字段,则将使用反射将其直接设置在字段中。 如果是setter,则将使用依赖项调用该方法。 如果构造函数(这是我强烈建议的选择),则将以所有适当的依赖项调用构造函数。

我强烈建议使用构造函数注入,因为它使我们回到Java中真正的面向对象的编程中,在Java中,构造函数的工作是在有效状态下创建对象。 如果没有提供所有必需的依赖关系,则无法在Spring之中或之外(尤其是在单元测试中)使用该类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM