谁能帮我写一个关于实现ApplicationContextAware接口的小例子

求一个网名 发布于 2015/06/28 18:52
阅读 1K+
收藏 0
初学spring,很多东西都不懂,今天学习这部分内容的时候,使用getBean方法,返回值为null,一直找不到原因,请各位指教,还麻烦写一个小例子,非常感谢
package org.fkjava.spring.service;

import java.util.Map;

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

/**
 * 获取spring容器,以访问容器中定义的其他bean
 * 
 * 以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候中取出ApplicaitonContext.
 * 
 * @author py
 *
 */
public class SpringContextUtil implements ApplicationContextAware {
	/*
	 * Spring应用上下文环境
	 */
	private static ApplicationContext context = null;

	/*
	 * 实现ApplicationContextAware接口的回调方法,设置上下文环境
	 */
	@Override
	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		SpringContextUtil.context = applicationContext;
	}

	/*
	 * 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型.
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getBean(String name) {
		checkApplicationContext();
		return (T) context.getBean(name);
	}

	/*
	 * 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型. 如果有多个Bean符合Class, 取出第一个.
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getBean(Class<T> clazz) {
		checkApplicationContext();
		Map beanMaps = (Map) context.getBeansOfType(clazz);
		if (beanMaps != null && !beanMaps.isEmpty()) {
			return (T) beanMaps.values().iterator().next();
		} else {
			return null;
		}
	}

	private static void checkApplicationContext() {
		if (context == null) {
			throw new IllegalStateException(
					"applicaitonContext未注入,请在applicationContext.xml中定义SpringContextUtil");
		}
	}

	/*
	 * 取得存储在静态变量中的ApplicationContext.
	 */
	public static ApplicationContext getApplicationContext() {
		return context;
	}

}



配置文件

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

	<!-- 通过ApplicationContextAware获取spring容器中的bean -->
	<bean id="SpringApplicationContext" class="org.fkjava.spring.service.SpringContextUtil" />

	<bean id="dog" class="test.Dog">
		<property name="name">
			<value>旺财</value>
		</property>
		<property name="age">
			<value>5</value>
		</property>
	</bean>
</beans>



加载中
0
guor
guor
那个类的作用是,将Spring的上下文也就是ApplicationContext注入到SpringContextUtil中,然后以静态属性保存下来,这样可以在非Spring托管的环境中,获取到Spring信息,Spring托管的bean之间是可以依赖注入的,非Spring托管的环境获取Spring信息有时是很有必要的,只有这点作用了
0
CoderLeon
CoderLeon
代码没问题啊
0
王爵nice
王爵nice

setApplicationContext(ApplicationContext applicationContext)



这个方法有调用吗?

0
求一个网名
求一个网名

引用来自“王爵”的评论

setApplicationContext(ApplicationContext applicationContext)



这个方法有调用吗?

就是没有啊,不知道咋回事
0
求一个网名
求一个网名

引用来自“CoderLeon”的评论

代码没问题啊
是没有问题,但是setApplicationContext方法没有被调用
0
guor
guor
既然getBean返回值是null,而不是异常,说明setApplicationContext调用成功了的
0
求一个网名
求一个网名

引用来自“guor”的评论

既然getBean返回值是null,而不是异常,说明setApplicationContext调用成功了的

好像我的主函数写错了,又不知道怎么I写,麻烦帮我看看嘛

package test;

import org.fkjava.spring.service.SpringContextUtil;

public class Main {

	public static void main(String[] args) throws Exception {
		
		
		Dog info = (Dog) SpringContextUtil.getBean("dog");
		System.out.println(info);
	}

}
报错信息:

Exception in thread "main" java.lang.NullPointerException
	at org.fkjava.spring.service.SpringContextUtil.getBean(SpringContextUtil.java:39)
	at test.Main.main(Main.java:10)



0
求一个网名
求一个网名

引用来自“王爵”的评论

setApplicationContext(ApplicationContext applicationContext)



这个方法有调用吗?

没有调用
0
guor
guor

引用来自“guor”的评论

既然getBean返回值是null,而不是异常,说明setApplicationContext调用成功了的

引用来自“求一个网名”的评论

好像我的主函数写错了,又不知道怎么I写,麻烦帮我看看嘛

package test;

import org.fkjava.spring.service.SpringContextUtil;

public class Main {

	public static void main(String[] args) throws Exception {
		
		
		Dog info = (Dog) SpringContextUtil.getBean("dog");
		System.out.println(info);
	}

}
报错信息:

Exception in thread "main" java.lang.NullPointerException
	at org.fkjava.spring.service.SpringContextUtil.getBean(SpringContextUtil.java:39)
	at test.Main.main(Main.java:10)



确实写错了啊,你没有启动Spring容器啊,调用SpringContextUtil.getBean之前,加上ApplicationContext ctx = new ClassPathXmlApplicationContext("...");
0
求一个网名
求一个网名

引用来自“guor”的评论

既然getBean返回值是null,而不是异常,说明setApplicationContext调用成功了的

引用来自“求一个网名”的评论

好像我的主函数写错了,又不知道怎么I写,麻烦帮我看看嘛

package test;

import org.fkjava.spring.service.SpringContextUtil;

public class Main {

	public static void main(String[] args) throws Exception {
		
		
		Dog info = (Dog) SpringContextUtil.getBean("dog");
		System.out.println(info);
	}

}
报错信息:

Exception in thread "main" java.lang.NullPointerException
	at org.fkjava.spring.service.SpringContextUtil.getBean(SpringContextUtil.java:39)
	at test.Main.main(Main.java:10)



引用来自“guor”的评论

确实写错了啊,你没有启动Spring容器啊,调用SpringContextUtil.getBean之前,加上ApplicationContext ctx = new ClassPathXmlApplicationContext("...");
我以为spring容器自动加载的,写上这个ApplicationContext ctx = new ClassPathXmlApplicationContext("...");那何必还要写那个类,有什么好处,你能给我讲解一下吗?
返回顶部
顶部