使用构造函数args启用bean - WebApplicationContext vs ClassPathApplicationContext

时间:2014-05-08 18:06:35

标签: java spring dependency-injection applicationcontext

applicationContext.xml上的bean defiend正在使用ClassPathXmlApllicationContext和WebApplicationContext进行实例化。在使用前者时,bean按预期返回,但在使用后者WebApplicationContext时,我得到一个空值。

仅供参考:完全不使用Spring。仅用于定义bean并初始化它。它是一个基于jboss的Web服务应用程序。

我在web.xml中定义了WebApplicationContext,如下所示

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
     xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

     <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>

<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

<servlet>
    <display-name>Service</display-name>
    <servlet-name>MService</servlet-name>
    <servlet-class>
        com.xyz.atop.ws.memb.MServiceImpl
    </servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>MService</servlet-name>
    <url-pattern>/Service</url-pattern>
</servlet-mapping>
</web-app>

applicationContext.xml

中的条目
 <beans ...>
 <context:annotation-config />

 <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

 <bean id="helper" name="helper" class="com.xyz.svc.wrapper.Helper">
    <constructor-arg type="java.lang.String" value="ABC"/> 
 </bean>
 </beans>

在我的代码中使用ClassPathApplicationContext(按预期返回bean实例),如下所示

private static Helper helper;

public MServiceImpl() {
}    
static {
    ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    helper = (Helper) appContext.getBean("helper");
}
......
......

在使用WebApplicationContext时,我尝试了@Autowired注释,甚至尝试了setter注入。这两种方式都是我返回的空值。

我正在尝试初始化的“Helper”类来自jar文件,而jar文件又调用了cxf-spring应用程序。

请查看上面的场景,并建议在使用WebApplicationCOntext时删除空指针。

2 个答案:

答案 0 :(得分:0)

好的,春豆被注入其他春豆。 MService也需要是一个bean。然后,Autowire将帮助程序注入MService bean。您不能使用静态初始化程序来执行此操作,因为它是在加载应用程序上下文之前的类加载时运行的。此外,助手不应该是静态的 - 这是不好的做法 - 它使测试变得非常困难。

答案 1 :(得分:0)

场景:使用WebApplicationContext初始化applicationCOntext.xml文件中定义的bean,并在自动装配后尝试在代码中使用即时bean对象时收到null。

本场景中的问题:我正在尝试在Spring控制的类中自动装配一个spring bean。

解决方案: 使用Spring的SpringBeanAutowiringSupport类扩展Servlet类(不在Spring控件中的类)是我的JBOSS WS的端点,这帮助我解决了这个问题。

以下是代码段

public class MServiceImpl extends SpringBeanAutowiringSupport implements MService{

     @Autowired
     private Helper helper;

     public MServiceImpl() {
     }    
......
......
}

想通过使用静态块初始化spring bean是不好的方法。感谢@Engineer Dollery