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()方法,将上下文自动初始化,但我这里并没有,根本就没有去执行这个方法,不知道配置哪里错了?
問題が見つかったようです、私は本当に愚かです、本当に愚かです。 。 。
web.xml ファイルは Tomcat コンテナの起動時にのみ起動されるとのことですが、私が書いたのはコントローラープログラムであり、Tomcat は全く存在しません。 。 。
Web コンテナと何の関係がありますか? Spring コンテナをロードする方法は複数あります。
ioc コンテナが初期化されていません。最初に ApplicationContext をインスタンス化してください
@青楼guilty ApplicationContextAware には getBean() メソッドがあります。なぜ独自の getBean() メソッドを記述する必要があるのでしょうか?分かりません。コードが多すぎるということは、Spring がアプリケーション コンテキストを通じて Java Bean を取得するという意味ではないでしょうか?
SpringTest(实现ApplicationContextAware的类)
は管理のためにspring bean
に追加する必要があります。Compnent
アノテーションを使用するか、xml
ファイルで設定できます。そうでない場合、
spring
はこれを処理できません。それが、applicationContext
がnull
である理由です。私も数日前に同じ問題に遭遇しました。私の場合は、リフレクションによってインスタンス化され、Spring インスタンスを取得するためにこのようなクラスを作成しました。 . その後、lazy-init="false" を追加しましたが、今回は spring4 を使用した場合は追加する必要はありませんでした。