当前位置: 首页 > 知识库问答 >
问题:

让Spring@Autowired和@postconstuct工作

司徒鸿文
2023-03-14

我正在尝试向现有项目引入一个新bean

当前bean是

package w.x.y.z.pkgA
@Component
public class BeanA implements InterfaceA {

}

我正在尝试添加新的Bean到w.x.y.z.pkgB

package w.x.y.z.pkgB
public class BeanB implements InterfaceB {

    @Autowired
    private BeanA beanA

    @PostConstruct
    public void postConstructMethod() {
        //Call some method in BeanA
    }
}

BeanB我想访问BeanA数据,在BeanB后期构造中,我想注册BeanB。所以我想调用BeanA方法

所有这些包都打包为jar和Spring上下文xml

<context:annotation-config />
<context:component-scan base-package="w.x.y.z.pkgA,w.x.y.z.pkgB" />
<bean id="beanb" clas="w.x.y.z.pkgB.BeanB"></bean>

但在部署期间,我得到了关于处于create状态的bean的异常

Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'context': Requested bean is currently in creation: Is there an unresolvable circular reference?
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.beforeSingletonCreation(DefaultSingletonBeanRegistry.java:347)
at w.x.y.z.BeanA<init>(BeanA.java:25)
at w.x.y.z.BeanB.<init>(BeanB.java:35)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147)

我还尝试删除@Autowired并使用getBeanFactory().getBean(BeanA.class)获取BeanA对象。但我也犯了同样的错误。

如果我从xml文件中删除bean条目,它会得到正确的部署,但是post构造永远不会被调用,因为它不再是bean了。

BeanA完全不依赖于BeanB。没有推荐人?

当两个bean在同一个jar中时,有没有办法让这个@Autowired@PostConstruct工作?

共有1个答案

白嘉志
2023-03-14

您将bean声明为

尝试与

package w.x.y.z
@Component
public class BeanA implements InterfaceA {

}
package w.x.y.z
public class BeanB implements InterfaceB {

    private BeanA beanA

    @PostConstruct
    public void postConstructMethod() {
        //Call some method in BeanA
    }

    // Getters and Setters
}

<context:annotation-config />
<context:component-scan base-package="w.x.y.z" />
<bean id="beanb" clas="w.x.y.z.BeanB">
    <property name="beanA" value="beanA"/> <!-- Spring will create beanA as it is annotated with @Component -->
</bean>

 类似资料:
  • 问题内容: 是否通过@Autowired自动检测到?使用@Qualifier时是否按名称进行依赖项注入?我们如何使用这些批注进行setter和构造函数注入? 问题答案: 你可以与一起使用。实际上,如果发现模棱两可的bean类型,spring会询问你是否明确选择了bean,在这种情况下,你应该提供限定符 例如在以下情况下,有必要提供一个限定词 编辑: 在Lombok 1.18.4中,最终可以避免使用

  • 我在GWT+Spring Boot中创建了一个应用程序,当我尝试使用-时,我得到。显然不起作用,没有将bean插入正确的位置。我怎样才能解决这种情况? 分派传入RPC调用时发生异常 ExpectiontedException:服务方法“public abstract java.util.list com.mygwt.springbootapp.client.userservice.list()”引

  • 是否使用@autowired自动检测?使用@qualifier时是否按名称进行依赖注入?我们如何使用这些注释进行setter和constructor注入?

  • 问题内容: 我遇到了一个例子: 我很好奇如何获取集合,因为没有设置方法,而且它是私有的。 问题答案: Java允许上一个字段或方法的访问控制被关断(是的,有一个安全检查到第一通路)经由方法,其是反射框架(二者的一部分Field和从继承)。一旦发现并写入了该字段,其余的工作就变得很简单了。只是一个简单的编程问题。 分享

  • 我问了一个类似的问题,以为得到了回答。然而,昨天它停止工作,所以我要再问一遍,但我的修改类。我希望这是正确的协议.... 我有一个spring启动网站,它在启动时抛出一个空指针,因为其中一个类没有自动连线。以下是我的设置: 在子包中,我有:package com.company.product.configuration@configuration@componentScan()public cl

  • 我正在使用Java和Spring开发一个web应用程序。我是Spring的新手,所以作为一个学习的机会,我基本上得到了一个现有的应用程序,并被告知要扩展它。我很难理解@Autowired是如何工作的。我理解依赖注入的高级概念,但我想知道@AutoWired注释是如何知道要注入接口的哪个具体实现的? 为了使我的问题符合上下文,我将解释我所遇到的问题: 我有一个名为PostDao的接口,还有一个名为P