Java 使用构造函数args初始化bean-WebApplicationContext与ClassPathApplicationContext

Java 使用构造函数args初始化bean-WebApplicationContext与ClassPathApplicationContext,java,spring,dependency-injection,applicationcontext,Java,Spring,Dependency Injection,Applicationcontext,applicationContext.xml上的bean定义将使用ClassPathXMLApplicationContext和WebApplicationContext进行实例化。在使用前者时,bean按预期返回,但在使用后者WebApplicationContext时,我得到一个空值 仅供参考:未充分使用弹簧。只是用来定义一个bean并初始化它。它是一个基于jboss的web服务应用程序 我在web.xml中定义了WebApplicationContext,如下所示 <?xml ver

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

仅供参考:未充分使用弹簧。只是用来定义一个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>
在使用WebApplicationContext时,我尝试了@Autowired注释,甚至尝试了setter注入。这两种方式都返回空值

我试图初始化的Helper类来自一个jar文件,该文件反过来调用cxf spring应用程序


请查看上述场景,并建议在使用WebApplicationCOntext时去掉空指针。

好的,SpringBean被注入到其他SpringBean中。MService也需要是一个bean。Autowire然后将助手注入MServicebean。不能使用静态初始值设定项来执行此操作,因为它是在类加载时运行的,而类加载时是在应用程序上下文加载之前。此外,helper不应该是静态的-这是一种糟糕的做法-它使测试变得非常困难。

场景:使用WebApplicationContext初始化applicationCOntext.xml文件中定义的bean,并在自动关联后尝试在代码中使用Instantated bean对象时收到空值

这个场景中的问题:我试图在spring控制的类中自动连接Springbean

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

下面是代码片段

public class MServiceImpl extends SpringBeanAutowiringSupport implements MService{

     @Autowired
     private Helper helper;

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

我发现使用静态块初始化Springbean是一种糟糕的方法。多亏了@Engineer Dollery

,这才有意义。但我现在要问的问题是,当我尝试使用WebApplicationContext和Autowiring时,为什么Springbean实例返回为null?这很可能是应用程序中加载顺序的问题。静态初始值设定项在类加载器加载该类时运行,这是在初始化应用程序上下文之前。要实现这一点,您必须将自己注册为上下文完成初始化后引发的事件的侦听器。有关信息,请参见此问题:我没有同时使用ClassPathApplicationContext和WebApplicationContext。如果我使用ClassPathApplicationCOntext,那么web.xml中加载上下文文件的条目将被删除,当我尝试使用WebApplicationContext时,我将在web.xml中添加条目,并从实现类中删除静态块,并用@Autowired注释替换它,以解决非静态私有类HelperSame问题。静态初始值设定项在类加载后立即运行,这可能早于spring应用程序上下文加载时间,但它是启动的。
private static Helper helper;

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

     @Autowired
     private Helper helper;

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