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声明为原型。因此,每次您请求它的对象时,它都会给您一个用其属性初始化的新对象。该对象中的自动连接字段将适用于您的。:-)