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



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

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();
}
}

Second.java

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

Application.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:创建com.example.sample.SampleApplication:通过工厂方法实例化bean失败;嵌套异常为org.springframework.beans.BeanInstanceException:未能实例化[com.example.sample.First]:工厂方法"First"引发异常;嵌套异常为java.lang.NullPointerException:无法调用"com.example.sample.Second.printFromSecond()",因为"this.Second"为null在org.springframework.beans.factory.support.ConstructureResolver.instante(ConstructorResolver.java:658)~[spring-beans-5.320.jar:5.3.20]在org.springframework.beans.factory.support.ConstructureResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:486)~[spring-beans-5.320.jar:5.3.20]网址:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352)~[spring-beans-5.320.jar:5.3.20]在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195)~[spring-beans-5.320.jar:5.3.20]在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582)~[spring-beans-5.320.jar:5.3.20]网址:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)~[spring-beans-5.320.jar:5.3.20]在org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)~[spring-beans-5.320.jar:5.3.20]位于org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)~[spring-beans-5.320.jar:5.3.20]网址:org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)~[spring-beans-5.320.jar:5.3.20]网址:org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)~[spring-beans-5.320.jar:5.3.20]位于org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:953)~[spring-beans-5.320.jar:5.3.20]位于org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918)~[spring-context-5.3.20.jar:5.3.20]网址:org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)~[spring-context-5.3.20.jar:5.3.20]网址:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplication context.java:147)~[spring-boot-2.7.0.jar:2.7.0]网址:org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734)~[spring-boot-2.7.0.jar:2.7.0]网址:org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408)~[spring-boot-2.7.0.jar:2.7.0]网址:org.springframework.boot.SpringApplication.run(SpringApplication.java:308)~[spring-boot-2.7.0.jar:2.7.0]网址:org.springframework.boot.SpringApplication.run(SpringApplication.java:1306)~[spring-boot-2.7.0.jar:2.7.0]网址:org.springframework.boot.SpringApplication.run(SpringApplication.java:1295)~[spring-boot-2.7.0.jar:2.7.0]在com.example.sample.SampleApplication.main(SampleApplication.java:11)~[classes/:na]由:org.springframework.beans.BeanInstanceException引起:未能实例化[com.example.sample.First]:工厂方法"First"引发异常;嵌套异常为java.lang.NullPointerException:无法调用"com.example.sample.Second.printFromSecond()",因为"this.Second"为null网址:org.springframework.beans.factory.support.SimpleInstantiationStrategy.instante(SimpleInstantiatonStrategy.java:185)~[spring-beans-5.320.jar:5.3.20]在org.springframework.beans.factory.support.ConstructorResolver.instante(ConstructorResolver.java:653)~[spring-beans-5.320.jar:5.3.20]…省略了19个常见帧由java.lang.NullPointerException引起:无法调用"com.example.sample.Second.printFromSecond()",因为"this.Second"为null在com.example.sample.First.printFromFirst(First.java:16)~[classes/:na]在com.example.sample.SampleApplication.first(SampleApplication.java:17)~[classes/:na]在com.example.sample.SampleApplication$$EnhancerBySpringCGLIB$$badcf278.CGLIB$first$0()~[classes/:na]在com.example.sample.SampleApplication$$EnhancerBySpringCGLIB$$badcf278$$FastClassBySpringCGLIB$$68c83451.invoke()~[classes/:na]网址:org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244)~[spring-core-5.3.20.jar:5.3.20]位于org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.cintercept(ConfigurationClassEnancer.java:331)~[spring-context-5.3.20.jar:5.3.20]在com.example.sample.SampleApplication$$EnhancerBySpringCGLIB$$badcf278.first()~[classes/:na]位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)~[na:na]位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)~[na:na]位于java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)~[na:na]位于java.base/java.lang.reflect.Method.ioke(Method.java:567)~[na:na]网址:org.springframework.beans.factory.support.SimpleInstantiationStrategy.instante(SimpleInstantiatonStrategy.java:154)~[spring-beans-5.320.jar:5.3.20]…省略了20个常见框架

我可以使用依赖注入来锻炼解决方案。我只想这样做。

TIA-

虽然这是一个令人讨厌的黑客攻击,我认为没有人会建议这样做,但这应该"工作;(这将带来许多问题):

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

最新更新