2012-06-12 10 views
9

Tengo dos granos de primavera de la siguiente manera:Autowiring en la primavera de frijol (@Component) creado con la nueva palabra clave

@Component("A") 
@Scope("prototype") 
public class A extends TimerTask { 

    @Autowired 
    private CampaignDao campaignDao; 
    @Autowired 
    private CampaignManager campManger; 
    A(){ 
     init_A(); 
     } 
    } 

Tengo que hacer un nuevo objeto de A con nueva palabra clave, debido a un código heredado

@Component("B") 
@Scope("prototype") 
public class B{ 
    public void test(){ 
     A a = new A(); 
    } 
} 

al ejecutar -> los granos de primavera en la clase A son nulos, ¿puedo crear una nueva instancia del bean de primavera A y aún utilizar el autoencendido en ella?

+1

se han definido '' campaignDao' y campManger' en sus definiciones de frijol de primavera presentar? – davioooh

+0

@davioooh: sí – abdelhady

Respuesta

15

El componente suyo "A" no se crea con el contenedor Spring, por lo tanto, las dependencias no se inyectan. Sin embargo, si usted necesita para apoyar algunas código heredado (como entiendo de su pregunta), puede utilizar @Configurable anotación y construcción/tiempo de compilación tejer:

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

Entonces, Primavera inyectará dependencias autowired al componente A, sin Importa si el propio contenedor crea una instancia, o si se crea una instancia en algún código heredado por new.

Por ejemplo, para establecer la acumulación de tiempo de tejer con Maven plugin que tiene que:

  1. Añadir <context:spring-configured/> al contexto de aplicación de Primavera
  2. Configurar Maven AspectJ plugin:

en los plugins de construcción sección:

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

... y la sección de dependencias:

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

por favor consulte la primavera referencia para más detalles: http://static.springsource.org/spring/docs/current/spring-framework-reference/html/aop.html#aop-atconfigurable

+0

la clase A se instancia en otras clases con la palabra clave nueva, ¿puedo hacer autocableado en la clase A después de crear un nuevo objeto utilizando la palabra clave new? – abdelhady

+0

Sí, por favor, eche un vistazo al capítulo en la documentación de referencia de Spring que publiqué. Es posible con la anotación @Configurable y el tiempo de compilación/carga del tiempo. –

+0

bueno, hice el bean de primavera que se creó con la nueva palabra clave '@Configurable (autowire = Autowire.BY_TYPE)' y aún obtengo el mismo comportamiento, entonces ¿qué me falta? y qué quiere decir con compilación/tiempo de carga de tejido – abdelhady

2

Dado que está creando el objeto de clase A usted mismo utilizando el nuevo operador, no obtiene los campos autoconectados en ese objeto y los encuentra nulos. Intenta sacar el frijol del contenedor de primavera.

Espero que esto te ayude. Aclamaciones.

+0

tengo que crear un nuevo objeto desde A, ¿puedo crear un nuevo objeto desde A y todavía puedo autoaumentar en A – abdelhady

+0

No, no es posible. En lugar de eso, debes declarar tu bean A como prototipo. De modo que cada vez que solicite su objeto, le dará un objeto nuevo inicializado con sus propiedades. Y los campos autoelejados en ese objeto funcionarán para usted. :-) –

+0

por favor, lea la respuesta anterior que funcionará con la nueva palabra clave – abdelhady

Cuestiones relacionadas