【问题标题】:Spring creating bean but not injecting itSpring创建bean但不注入它
【发布时间】:2015-05-29 08:21:14
【问题描述】:

我知道有很多关于 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 为空(这也是引发 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/> 

我猜这只是我的一些相当愚蠢的错误,但我就是想不通,谷歌搜索也无济于事。

感谢您的帮助。

【问题讨论】:

  • (1) 除非你的逻辑真的很不寻常,否则请使用 Spring Data 而不是编写自己的 DAO。 (2) 使用@PersistenceUnit 注入一个JPA EMF。
  • @chrylis 第一次听到有关 Spring Data 的消息,必须看看...我也在应用程序配置中为 EMF 使用 &lt;bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"&gt;
  • @Configurable 需要加载时间编织。你启用了吗?
  • 如果 Spring 尝试接线但失败,您将收到接线异常。不管你说什么,我怀疑是一个非托管 bean。
  • @chrylis 当我将非参数构造函数替换为参数构造函数时,它抛出 bean 创建异常,说它找不到合适的构造函数

标签: java spring javabeans autowired inject


【解决方案1】:

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

尝试从AbstractService 中删除@Configurable,因为它是一个抽象类。还要从WechatMessageService 中删除@Component,因为你已经有了@Service,所以不需要@Component

为您的 AbstractService 课程尝试以下操作:

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

使用@Resource 更好地执行按名称自动装配,因此您不需要使用限定符。

【讨论】:

    【解决方案2】:

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

    感谢大家的帮助,因为它促使我​​意识到这一点,并帮助我更好地理解 Spring 及其注释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 2012-07-24
      • 1970-01-01
      • 2015-12-14
      相关资源
      最近更新 更多