Autowiring in Spring bean (@Component) created with new keyword

dependency-injection, jakarta-ee, java, spring

Solution

Yours component "A" is not created by Spring container, thus, dependencies are not injected. However, if you need to support some legacy code (as I understand from your question), you can use `@Configurable` annotation and build/compile time weaving:

@Configurable(autowire = Autowire.BY_TYPE)
public class A extends TimerTask {
  // (...)
}

Then, Spring will inject autowired dependencies to component A, no matter if it's instantiated by container itself, or if it's instantiated in some legacy code by `new`.

For example, to set up build-time weaving with maven plugin you have to:

- Add `<context:spring-configured/>` to the Spring application context

- Configure Maven AspectJ plugin:

in the build plugins section:

<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>

...and the dependencies section:

<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>

Please consult Spring reference for more details: http://static.springsource.org/spring/docs/current/spring-framework-reference/html/aop.html#aop-atconfigurable

Problem

I have two spring beans as follows: ``` @Component("A") @Scope("prototype") public class A extends TimerTask { @Autowired private CampaignDao campaignDao; @Autowired private CampaignManager campManger; A(){ init_A(); } } ``` I have to make a new object of A with new keyword, due to a legacy code ``` @Component("B") @Scope("prototype") public class B{ public void test(){ A a = new A(); } } ``` when Running -> the spring beans in the class A are null, can i create a new instance of the spring bean A and still use autowiring in it ?

Original source