Maison  >  Questions et réponses  >  le corps du texte

java - ApplicationContextAware方式获取上下文,但是最终却报错:NullPointerException?

1.今天想使用ApplicationContextAware接口方式去获取上下文环境,从而去获取bean,自己照着例子去写了一遍,但是最后还是报错,找不到这个bean,貌似实现了ApplicationContextAware的这个类根本就没有被Spring初始化的时候初始化执行setApplicationContext()方法(我已经在配置文件配置了这个bean),下面是我的代码:
2.工程代码
(1)web.xml

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

  <display-name>spring-test</display-name>
  <!-- spring config begin -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
      classpath*:config/spring/local/appcontext-*.xml
    </param-value>
  </context-param>
  <!-- end -->

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

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

</web-app>

(2).spring配置文件,我用的是idea,配置文件在config/spring/local下,Resource下面

<?xml version="1.0" encoding="utf-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
                            "> 
    <bean id="springTest" class="com.fcc.spring.test.SpringTest" lazy-init="false" /><!-- 谷歌搜索查到加lazy-init属性,但也没用 -->

    <bean id="helloWorld" class="com.fcc.spring.test.HelloWorld">
        <property name="message" value="Hello World!" />
    </bean>
</beans>

(3).SpringTest.java

package com.fcc.spring.test;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import javax.annotation.Resource;

public class SpringTest implements ApplicationContextAware{

    private static ApplicationContext applicationContext;


    public static void main(String[] args){
        HelloWorld obj = (HelloWorld)SpringTest.getBean("helloWorld");
        System.out.println("obj = " + obj);
        System.out.println("The message value is " + obj.getMessage());
    }

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("applicationContext before : " + applicationContext);
        SpringTest.applicationContext = applicationContext;
    }
    public static ApplicationContext getApplicationContext(){
        return applicationContext;
    }
    public static Object getBean(String name) throws BeansException{
        System.out.println("applicationContext = " + applicationContext);
        return applicationContext.getBean(name);
    }
}

HelloWorld的代码我就不贴了,就是一个简单的JavaBean,有个message:String属性
我理解的初始化顺序是这样的:
启动tomcat容器,加载web.xml,建立整个容器(Servlet容器,这里是tomcat吧)的上下文,ServletContext,这时web.xml有个监听器,就是ContextLoaderListener,监听到这个事件,就会去扫描spring配置文件,默认是applicationContext.xml文件(classpath,idea是Resource下),如果自定义,就应该如web.xml中的<context-param>标签那般配置,扫描这个指定的Spring配置文件,就会将文件中相应的bean加载,其中实现了ApplicationContextAware的bean类会去执行setApplicationContext()方法,将上下文自动初始化,但我这里并没有,根本就没有去执行这个方法,不知道配置哪里错了?

ringa_leeringa_lee2711 Il y a quelques jours618

répondre à tous(6)je répondrai

  • 迷茫

    迷茫2017-04-18 09:47:34

    On dirait que j'ai trouvé le problème. Je suis vraiment stupide, vraiment stupide. . .
    On dit que le fichier web.xml ne sera démarré qu'au démarrage du conteneur Tomcat, mais ce que j'ai écrit est un programme contrôleur et il n'y a pas de Tomcat du tout. . .

    répondre
    0
  • 黄舟

    黄舟2017-04-18 09:47:34

    Qu'est-ce que cela a à voir avec les conteneurs Web ? Il existe plusieurs façons de charger des conteneurs Spring.

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-18 09:47:34

    Le conteneur Ioc n'est pas initialisé, instanciez d'abord un ApplicationContext

    répondre
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:47:34

    @青楼guilty ApplicationContextAware a la méthode getBean(). Pourquoi devez-vous l'implémenter ? Écrivez votre propre méthode getBean(). Je ne comprends pas. Tant de code, cela ne signifie-t-il pas que Spring obtient des beans Java via le contexte de l'application ?

    répondre
    0
  • PHPz

    PHPz2017-04-18 09:47:34

    SpringTest(实现ApplicationContextAware的类) doit être ajouté à spring bean pour la gestion. Vous pouvez utiliser l'annotation Compnent ou la configurer dans le fichier xml.
    Sinon, spring ne gérerait pas cela, c'est pourquoi applicationContext est null.

    répondre
    0
  • 高洛峰

    高洛峰2017-04-18 09:47:34

    J'ai également rencontré le même problème il y a quelques jours. Dans mon cas, c'était dans une classe instanciée par réflexion et une instance gérée par Spring. J'ai également écrit une classe comme celle-ci pour que l'instance Spring commence à fonctionner. . Il n'a pas pu être injecté. Ensuite, j'ai ajouté lazy-init="false" et c'était bien, je n'ai pas eu besoin de l'ajouter lorsque j'ai utilisé spring3. Cette fois, j'espère que cela vous sera utile.

    répondre
    0
  • Annulerrépondre