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

如何在使用new关键字创建类的新实例时自动关联bean

谈灵均
2023-03-14

我正在尝试使用new关键字创建一个组件的新实例。组件类有另一个类的自动布线。在第一类中,它有一个调用第二类的方法。代码如下:

First.java

@Component
public class First {
    @Autowired
    private Second second;

    public First() {
        System.out.println("This is the first class constructor.");
    }

    public void printFromFirst() {
        second.printFromSecond();
    }
}

第二Java语言

@Component
public class Second {
    public void printFromSecond() {
        System.out.println("This is inside the second class print method.");
    }
}

一个pplication.java

@SpringBootApplication
public class SampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(SampleApplication.class, args);
    }

    @Bean
    public First first() {
        First first = new First();
        first.printFromFirst();
        return first;
    }
}
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'first' defined in com.example.sample.SampleApplication: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.example.sample.First]: Factory method 'first' threw exception; nested exception is java.lang.NullPointerException: Cannot invoke "com.example.sample.Second.printFromSecond()" because "this.second" is null
    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658) ~[spring-beans-5.3.20.jar:5.3.20]
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:486) ~[spring-beans-5.3.20.jar:5.3.20]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) ~[spring-beans-5.3.20.jar:5.3.20]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) ~[spring-beans-5.3.20.jar:5.3.20]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) ~[spring-beans-5.3.20.jar:5.3.20]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.20.jar:5.3.20]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.20.jar:5.3.20]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.20.jar:5.3.20]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.20.jar:5.3.20]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.20.jar:5.3.20]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:953) ~[spring-beans-5.3.20.jar:5.3.20]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[spring-context-5.3.20.jar:5.3.20]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.20.jar:5.3.20]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.0.jar:2.7.0]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) ~[spring-boot-2.7.0.jar:2.7.0]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) ~[spring-boot-2.7.0.jar:2.7.0]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) ~[spring-boot-2.7.0.jar:2.7.0]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-2.7.0.jar:2.7.0]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-2.7.0.jar:2.7.0]
    at com.example.sample.SampleApplication.main(SampleApplication.java:11) ~[classes/:na]
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.example.sample.First]: Factory method 'first' threw exception; nested exception is java.lang.NullPointerException: Cannot invoke "com.example.sample.Second.printFromSecond()" because "this.second" is null
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.3.20.jar:5.3.20]
    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ~[spring-beans-5.3.20.jar:5.3.20]
    ... 19 common frames omitted
Caused by: java.lang.NullPointerException: Cannot invoke "com.example.sample.Second.printFromSecond()" because "this.second" is null
    at com.example.sample.First.printFromFirst(First.java:16) ~[classes/:na]
    at com.example.sample.SampleApplication.first(SampleApplication.java:17) ~[classes/:na]
    at com.example.sample.SampleApplication$$EnhancerBySpringCGLIB$$badcf278.CGLIB$first$0() ~[classes/:na]
    at com.example.sample.SampleApplication$$EnhancerBySpringCGLIB$$badcf278$$FastClassBySpringCGLIB$$68c83451.invoke() ~[classes/:na]
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) ~[spring-core-5.3.20.jar:5.3.20]
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331) ~[spring-context-5.3.20.jar:5.3.20]
    at com.example.sample.SampleApplication$$EnhancerBySpringCGLIB$$badcf278.first() ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:567) ~[na:na]
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.3.20.jar:5.3.20]
    ... 20 common frames omitted

我能够使用依赖注入来训练解决方案。我只是想这样做。

提亚

共有1个答案

满玉泽
2023-03-14

虽然这是一个讨厌的黑客,我不认为任何人会推荐这样做,这应该“工作”(它会引入许多问题):

@Component
public class First {

    private static First instance;

    @Autowired
    private Second second;
    
    public First() {
        if (instance != null) {
            this.second = instance.second;
        }
    }

    @PostConstruct
    private void init() {
        instance = this;
    }

}
 类似资料:
  • 问题内容: 我有两个spring beans,如下所示: 由于遗留代码,我必须使用新关键字创建A的新对象 当运行->类A中的spring bean为null时,我可以创建spring bean A的新实例并在其中仍然使用自动装配吗? 问题答案: 你的组件“ A”不是由Spring容器创建的,因此不会注入依赖项。但是,如果你需要支持一些旧代码(据我的问题理解),则可以使用注释和构建/编译时间编织:

  • 我知道字符串文字和新字符串对象之间的区别,也知道它在内部是如何工作的。但我的问题是,这有点超前。当我们使用new关键字as创建字符串对象时 在本例中,我们传递的是字符串类型的参数。我的问题是这个字符串是在哪里生成的-堆还是字符串常量池还是其他地方? 据我所知,这个参数是一个字符串文字,所以它应该在字符串常量池中。如果是这样的话,那么intern方法的用途是什么?只需将变量str链接到常量池?因为“

  • 想改进这个问题吗 通过编辑此帖子,更新问题,使其只关注一个问题。 我正在学习Spring并构建一些实验应用程序。我不知道在哪里使用@Autowired来创建对象。 我得到了它促进松散耦合的部分,并且每次都创建一个新的对象,而不是“new”关键字所做的。 但是,对于我们需要在应用程序中使用的第三方对象,我们应该做些什么呢。例如,我正在使用一个rest API,为此我需要初始化三个类,如下所示 这段代

  • 假设我在前面有一个表单,它有常用的字段和下拉列表。在这些下拉列表中,用户可以选择一个选项,并且每个选项都链接到Spring data JPA中的一个实体; 下拉列表包含一些标签和对应实体的链接作为值。然后,这个值在POST-request中传递给我们希望创建的实体的PagingAndSorting存储库。 假设它是一个具有username的用户,并且他必须与其中一个办公室(也是一个实体)关联: 我

  • 我有一个bean,我必须自己创建它(使用),它有和注释。 如何让Spring处理我的bean中的这些注释? 相关问题: 在Spring,我可以从自动编织的豆子里自动编织新的豆子吗?

  • 问题内容: 如何在javascript关联数组中动态创建键? 到目前为止,我发现的所有文档都是更新已创建的密钥: 我有这样的字符串 我想结束这样的事情: 那就是我分割字符串并获取第一个元素,然后将其放入字典中。 码 问题答案: 使用第一个示例。如果密钥不存在,它将被添加。 将弹出一个包含“ oscar”的消息框。 尝试: