2009-05-14 14 views
8

Quiero escribir una aplicación independiente con IOC, ¿cómo utilizo la inyección de dependencia de muelles allí? Estoy usando JIdea. ¡Hay soporte para la primavera 2.5 pero quiero usar la primavera 3.0 aquí es la forma en que lo intenté!Spring- Cómo usar Spring Dependency Injection para escribir una Aplicación Java independiente

experiencia que en el uso de Spring MVC podemos inyectar dependencias allí en un WebApplicationContext Pero, ¿cómo me inyecto dependencias en una aplicación independiente

probé este

ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"com\\ttg\\xmlfile.xml"});

pero no puedo ver que las dependencias sean inyectadas por los beans definidos allí (en e archivo XML) Pongo el código anterior en el método principal y dos definiciones de bean para dos objetos, en un constructor de la clase Java utilicé el objeto de la otra clase -que se inyectó a este objeto- y llamé un método sobre eso que se imprimirá algo, pero no funcionó Pensé que el código anterior crea todas las dependencias y las inyecta pero no parece así

¿Cómo uso correctamente Springs IOC, inyección de dependencia en mi aplicación independiente que no contiene un WebApplicationContext?

Por favor, mencione los pasos.

+0

más tarde me di cuenta que no añadí una biblioteca que fue la razón --- --- antlr-3.0.1.jar – Buddhi

+0

Buddhi

Respuesta

17

suponga que tiene:

class Bean1 { 
    Bean2 bean2; 
} 

class Bean2 { 
    String data; 
} 

el archivo context.xml

<bean id="bean1" class="Bean1"> 
    <property name="bean2" ref="bean2" /> 
</bean> 

<bean id="bean2" class="Bean2" /> 

entonces esto debe ser cierto

ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"context.xml"}); 
Bean1 bean1 = (Bean1) context.getBean("bean1"); 

// bean1.bean2 should not be null here. 
0

¿Está llamando al context.getBean("beanName") para obtener una referencia al bean o está haciendo un new SomeClass()? Si lo hace a través de getBean(), entonces las propiedades inyectadas deben establecerse.

Además, asegúrese de utilizar la misma fábrica de bean (instancia ClassPathXmlApplicationContext) para recuperar todos sus beans. Probablemente, esto debería ser estático y utilizado por toda la aplicación.

1

¿Cómo confirmó que sus granos no están siendo conectados correctamente? Un problema común es que el archivo de configuración xml no está en el lugar correcto. ¿Puede darnos más información, como el diseño de su proyecto y el código que utiliza para obtener los frijoles del contenedor?

0

Si se agrega el registro de log4j para su aplicación, usted debe ver una cascada de mensajes que salen que le dirá mucho sobre lo que Spring es y lo que no está haciendo. Si no tienes esos comentarios, estás en la oscuridad. Es posible que pueda descubrir la respuesta simplemente obteniendo más información de Spring desde log4j.

9

puede utilizar el soporte de autovínculo provisto por Spring, para inyectar dependencias (y posiblemente aplicar postprocesadores) a un objeto que no forma parte del contexto de la aplicación.

En su caso, este objeto es su aplicación independiente.

Aquí está la manera de lograr esto. En este ejemplo, utilizo @Autowired (para b1), DI tradicional (para b2) y gancho de inicialización para b3. El soporte de autowiring con anotaciones supone que ha definido el postprocesador de resorte apropiado en el contexto de su aplicación (por ejemplo, al declarar <context:annotation-config/>).

public class StandaloneApp implements InitializingBean { 
    @Autowired private Bean1 b1; 
    private Bean2 b2; 
    private Bean3 b3; 

    public void afterPropertiesSet() throws Exception { 
    this.b3 = new Bean3(b1, b2); 
    } 

    public void setB2(Bean2 b2) { 
    this.b2 = b2; 
    } 

    public static void main(String... args) { 
    String[] locations = // your files relative to the classpath 
    ApplicationContext ac = new ClasspathXmlApplicationContext(locations); 
    // or use FileSystemXmlApplicationContext if the files are not in the classpath 

    StandaloneApp app = new StandaloneApp(); 
    AutowireCapableBeanFactory acbf = ac.getAutowireCapableBeanFactory(); 
    acbf.autowireBeanProperties(app, AUTOWIRE_BY_NAME, false); 
    acbf.initializeBean(app, "standaloneApp"); // any name will work 
    } 
} 

En este ejemplo, todo b1, b2 y b3 debe ser no nula (existen suponiendo granos de B1 y B2 en su contexto de aplicación).

No lo he probado (puede que incluso no se haya compilado debido a algún error tipográfico), pero la idea está en las últimas 3 líneas. Consulte los javadocs para AutowireCapableBeanFactory y mencione los métodos para ver exactamente qué sucede.

0

puede utilizar el comando @Autowired

2

Si prefiere (en su mayoría) de Java puro, se puede usar java config:

@Configuration 
pubic class MyConfig { 

    @Bean 
    public Bean1 bean1() { return new Bean1(); } 

    @Bean 
    public Bean2 bean2() { return new Bean2(bean1()); } 
} 

Y a continuación, crear una instancia:

ApplicationContext ctx = 
    new AnnotationConfigApplicationContext(MyConfig.class); 

Keep en mente, hay algunas cosas que la configuración impulsada por la anotación pura aún no admite (como cosas como tx: accionado por anotaciones), para lo cual es posible que necesite un código de cola xml.

<beans> 
    <tx:annotation-driven /> 
    <context:annotation-config/> 
    <bean class="MyConfig"/> 
</beans> 

y luego usar una forma basada en XML estándar de creación de la Application Context (como ClassPathXmlApplicationContext, o el cargador de muelle de contexto web, etc ...).

Cuestiones relacionadas