Java 使用new关键字创建的Springbean(@Component)中的自动连接
我有两种春豆,如下所示:Java 使用new关键字创建的Springbean(@Component)中的自动连接,java,spring,jakarta-ee,dependency-injection,Java,Spring,Jakarta Ee,Dependency Injection,我有两种春豆,如下所示: @Component("A") @Scope("prototype") public class A extends TimerTask { @Autowired private CampaignDao campaignDao; @Autowired private CampaignManager campManger; A(){ init_A(); } } 由于一个遗留代码,我必须使用n
@Component("A")
@Scope("prototype")
public class A extends TimerTask {
@Autowired
private CampaignDao campaignDao;
@Autowired
private CampaignManager campManger;
A(){
init_A();
}
}
由于一个遗留代码,我必须使用new关键字创建一个新的对象
@Component("B")
@Scope("prototype")
public class B{
public void test(){
A a = new A();
}
}
当运行->类A中的SpringBean为null时,我是否可以创建SpringBean A的新实例并在其中使用自动关联?因为您是使用new operator自己创建类A的对象,所以无法获取该对象中的自动关联字段并发现它们为null。尝试从spring容器中获取bean 希望这对你有帮助。干杯。您的组件“A”不是由Spring容器创建的,因此,不会注入依赖项。但是,如果您需要支持一些遗留代码(我从您的问题中了解到),您可以使用
@Configurable
注释和构建/编译时编织:
@Configurable(autowire = Autowire.BY_TYPE)
public class A extends TimerTask {
// (...)
}
然后,Spring将向组件A注入自连线依赖项,不管它是由容器本身实例化的,还是由new
在一些遗留代码中实例化的
例如,要使用maven插件设置构建时编织,您必须:
添加到Spring应用程序上下文中<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.4</version>
<configuration>
<complianceLevel>1.6</complianceLevel>
<encoding>UTF-8</encoding>
<aspectLibraries>
<aspectLibrary>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</aspectLibrary>
</aspectLibraries>
<!--
Xlint set to warning alleviate some issues, such as SPR-6819.
Please consider it as optional.
https://jira.springsource.org/browse/SPR-6819
-->
<Xlint>warning</Xlint>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.11</version>
</dependency>
org.codehaus.mojo
您是否在SpringBean定义文件中定义了campaignDao
和campManger
?在其他类中使用关键字new实例化了A类,在使用关键字new创建了一个新对象之后,我还可以在类A中进行自动布线吗?是的-请查看我发布的Spring参考文档中的章节。通过@Configurable注解和编译/加载时编织,这是可能的。好吧,我制作了Springbean,它是由new关键字@Configurable(autowire=autowire.by_TYPE)
创建的,并且仍然得到相同的行为,那么我缺少什么呢?编译/加载时编织是什么意思?要使其工作,必须在编译时(使用ant或maven插件)或运行时编织带注释的类型(请参阅)。我已经更新了答案,包括构建时编织的示例配置-这就是我使用的配置。当通过新关键字创建bean时,它仍然得到相同的行为,“@Autowired”字段仍然为空。那么我缺少什么呢@Piotrek Dei必须从a创建一个新对象,我可以从a创建一个新对象,并且仍然能够自动连线,这是不可能的。相反,您应该将bean声明为原型。因此,每次您请求它的对象时,它都会给您一个用其属性初始化的新对象。该对象中的自动连接字段将适用于您的。:-)