Spring创建bean但不注入它

时间:2015-03-25 15:10:22

标签: java spring javabeans autowired inject

我知道有很多关于Spring Autowired问题的问题,但是我找不到类似于我的任何东西,所以很抱歉,如果它是一个骗局......

我遇到了自动装配已创建的bean的问题(调试显示构造函数已运行),但它没有被注入。没有手动实例化的调用。 我在项目中有许多其他自动装配的字段,它们工作正常。 但最有趣的是,我在不同的项目中使用了相同的模式和配置,并在那里工作 ......

现在,这是代码:

创建但未注入的bean:

@Component("genericDao")
public class GenericHibernateJpaDao implements GenericDao {

    @Autowired
    protected EntityManagerFactory entityManagerfactory;

    public GenericHibernateJpaDao() {
    }
    //getters, setters and dao methods
}

GenericDao接口只定义方法,没有注释。

定义bean的服务超类:

@Configurable
public abstract class AbstractService {
    @Autowired
    protected GenericDao genericDao;
    //getters, setters
}

服务实现(声明位):

@Service
@Component
public class WechatMessageService extends AbstractService implements IMessageService {

genericDao.saveOrUpdate(n);的服务实现中的断点显示genericDao为null(这也是抛出NullPointerEx的行。) IMessageService是

@Service
@Configurable
@Transactional

application-config.xml(相关位):

<beans .......... default-autowire="byName">
    <context:component-scan base-package="package.with.dao" />
    <context:component-scan base-package="package.with.service" />
    <context:spring-configured/> 

我猜它只是我身上的一些相当愚蠢的错误,但我无法弄明白并且谷歌搜索没有帮助。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

如果您没有启用加载时编织(为了使用AspectJ),则不需要使用@Configurable注释。

尝试从@Configurable删除AbstractService,因为它是一个抽象类。同时从@Component移除WechatMessageService,因为您已经有@Service,因此不需要@Component

请为AbstractService课程尝试以下内容:

public abstract class AbstractService {
    @Resource(name = "genericDao")
    protected GenericDao genericDao;
    //getters, setters
}

使用@Resource可以更好地执行按姓名自动装配,因此您无需使用限定符。

答案 1 :(得分:0)

嗯,事实证明我在调试过程中误解了我的前提。 虽然我没有手动启动DAO bean,但我在测试的初始化中创建了 service 的手动实例,因为我需要将它传递给一个虚拟对象。 所以是啊......

感谢大家的帮助,因为它让我了解了这一认识并帮助我更好地理解了Spring及其注释。