java - ApplicationContextAware方式获取上下文,但是最终却报错:NullPointerException?
ringa_lee
ringa_lee 2017-04-18 09:45:34
0
6
614

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_lee
ringa_lee

ringa_lee

répondre à tous(6)
迷茫

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. . .

黄舟

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

Ty80

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

伊谢尔伦

@青楼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 ?

PHPzhong

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.

小葫芦

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!