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