spring获取ApplicationContext对象的方法——ApplicationContextAware
一、 引言
工作之余,在看一下当年学的spring时,感觉我们以前都是通过get~ set~方法去取spring的Ioc取bean,今天就想能不能换种模型呢?因为我们在整合s2sh时,也许有那么一天就不用再遵循model-dao-service-action了,所以还是可以通过其他方法获取applicationContext,然后再获取相应的bean的。
二、 方法
如何获取ApplicationContext对象呢?
1. 可通过ClassPathXmlApplicationContext, FileSystemClassPathXmlApplicationContext, FileSystemXmlApplicationContext 去加载applicationContext.xml等配置文件去加载;
2. 可通过实现ApplicationContextAware接口获取;
3. 也许还有其他.....
区别:
笔者暂且只比较一下1与2吧。第一种会产生一种新的一个ApplicationContext对象,而这个对象与由web启动时生成的ApplicationContext对象是持有一样的资源,而第2种则是取当前运行环境下的ApplicationContext的对象。
三、 示例
1. SpringHelper
package com.swyma.spring.core; import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware; public class SpringHelper implements ApplicationContextAware{ public static SpringHelper springHelper = new SpringHelper(); private static ApplicationContext applicationContext; public final static SpringHelper getInstance() {
return springHelper;
} private SpringHelper() {
super();
} @Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
} public ApplicationContext getApplicationContext() {
return applicationContext;
}
}
2. ISpringContext
package com.swyma.spring.core;
import org.springframework.context.ApplicationContext;
public interface ISpringContext {
ApplicationContext getContext();
<T> T lookup(String type);
<T> T lookup(Class cls);
boolean isSingleton(Class cls);
}
3. AbstractSpringContext
package com.swyma.spring.core;
import org.springframework.context.ApplicationContext;
public abstract class SpringContext implements ISpringContext {
@Override
public ApplicationContext getContext() {
return SpringHelper.getInstance().getApplicationContext();
}
}
4. basicSpringContext
package com.swyma.spring.service; import com.swyma.spring.core.SpringContext;
import com.swyma.spring.core.StringUtils; public class BasicSpringContext extends SpringContext{ static BasicSpringContext springContext = new BasicSpringContext(); public static BasicSpringContext getSpringContext() {
return springContext;
} public static void setSpringContext(BasicSpringContext springContext) {
BasicSpringContext.springContext = springContext;
} public <T> T lookup(String type) {
if(getContext().containsBean(type)) {
return (T) getContext().getBean(type);
}
return null;
} public <T> T lookup(Class cls) {
String type = cls.getSimpleName();
return lookup(StringUtils.toLowerInitial(type, true));
} public boolean isSingleton(Class cls) {
return getContext().isSingleton(StringUtils.toLowerInitial(cls.getSimpleName(),true));
} }
5. applicationContext.xml
<?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"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> <context:annotation-config />
<aop:aspectj-autoproxy />
<context:component-scan base-package="com.swyma.spring"/>
<bean id="springhelper" class="com.swyma.spring.core.SpringHelper" lazy-init="false"/>
</beans>
6. 测试用例
package com.swyma.spring.test; import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.swyma.spring.core.ISpringContext;
import com.swyma.spring.entity.User;
import com.swyma.spring.service.BasicSpringContext;
import com.swyma.spring.service.LoginService;
import com.swyma.spring.service.RegisterService;
import com.swyma.spring.service.ServiceFacade;
import com.swyma.spring.service.UserService; /**
* juint test
* @author yemaoan
*
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:applicationContext.xml" })
public class TestSpringEnv { @Test
public void testLookup() {
ISpringContext context = BasicSpringContext.getSpringContext();
LoginService loginService = context.lookup(LoginService.class);
loginService.handle();
} @Test
public void testAspect() {
ISpringContext context = new BasicSpringContext();
UserService userService = context.lookup(UserService.class);
RegisterService registerService = context.lookup(RegisterService.class);
userService.create(new User());
registerService.create();
} @Test
public void testFacade() {
ServiceFacade serviceFacade = new ServiceFacade();
LoginService loginService = serviceFacade.getLoginService();
loginService.handle();
} }
6. 其他的各种service就不再罗列了......
四、 总结
1. 利用这种取ApplicationContext会不会造成混乱呢,也即是资源不同步呢?其实笔者认为,我们也只是取到这个ApplicationContext对象,利用这个对象来获取我们所需要的Bean资源,并未对该对象进行修改更新操作,所以觉得这个在应用过程中还是安全的。
spring获取ApplicationContext对象的方法——ApplicationContextAware的更多相关文章
- 获取applicationContext对象的方法
方法一:在初始化时保存ApplicationContext对象 代码: ApplicationContext ac = new FileSystemXmlApplicationContext(&quo ...
- 在Spring应用中创建全局获取ApplicationContext对象
在Spring应用中创建全局获取ApplicationContext对象 1.需要创建一个类,实现接口ApplicationContextAware的setApplicationContext方法. ...
- Spring获取ApplicationContext方式,和读取配置文件获取bean的几种方式
转自:http://chinazhaokeke.blog.163.com/blog/static/109409055201092811354236 Spring获取ApplicationContex ...
- SpringBoot项目中获取applicationContext对象
ApplicationContext 对象是Spring开源框架的上下文对象实例,也就是我们常说的Spring容器,一般情况下我们是不用手动来管理它,而是由Spring框架自己来维护bean之间的关系 ...
- springMVC 使用WebApplicationContext获取ApplicationContext对象
主要用于从application中获取bean 1.applicationContext 在web.xml中使用listener配置 <context-param> <param-n ...
- 获取InputStream对象的方法
获取InputStream对象的方法 getResourceAsStream(String path) 默认path路径位于Class所在Module的src目录下 . InputStream is ...
- spring中获取ApplicationContext对象的技巧,含源码说明
第一步,实现接口ApplicationContextAware,重写setApplicationContext方法,下方代码标红的地方,绿色部分 可以通过声明来进行存储到本类中. @Component ...
- Spring获取ApplicationContext
在Spring+Struts+Hibernate中,有时需要使用到Spring上下文.项目启动时,会自动根据applicationContext配置文件初始化上下文,可以使用ApplicationCo ...
- 【转】SpringTest框架JUnit单元测试用例获取ApplicationContext实例的方法
转自:http://www.coderli.com/junit-spring-test-applicationcontext JUnit单元测试用例中使用Spring框架,直接方式如下. @RunWi ...
随机推荐
- 用js判断时间的先后顺序
我们在用户注册信息的时候,有时根据需要往往要加入一些时间上的判断,今天我在这里给大家推荐一款比较实用的时间先后顺序判断的代码,希望对大家有所有帮助. <!DOCTYPE HTML> < ...
- Apache轻量级性能测试工具
平时工作中会需要一些性能测试,简单的性能测试完全可以由AB来替代,而不需要动用LR这样重量级的工具. 此文简单介绍一下ab的工具使用与结果分析.当作个笔记,以便以后查阅. 1.安装:要使用AB,需要先 ...
- java 15-2 Collection的高级功能测试
A: boolean addAll(Collection c):添加一个集合的元素 ,所有的元素,无论是否重复 B: boolean removeAll(Collection c):移除一个集合的 ...
- [转] Linux下防火墙iptables用法规则详及其防火墙配置
from: http://www.cnblogs.com/yi-meng/p/3213925.html 备注: 排版还不错,建议看以上的链接. iptables规则 规则--顾名思义就是规矩和原则,和 ...
- 记录使用gogs,drone搭建自动部署测试环境
使用gogs,drone,docker搭建自动部署测试环境 Gogs是一个使用go语言开发的自助git服务,支持所有平台 Docker是使用go开发的开源容器引擎 Drone是一个基于容器技术的持续集 ...
- VisualStudio2013+EF6+MySql5.5环境下配置
看院子里对EF框架和MySql的配置文章不少,但是几乎出自一篇文章的转载,而且这篇转载的文章的也比较坑爹,下面我将介绍一下我的配置过程: 第一步:安装mysql-connector-net-6.9.9 ...
- 项目移植将eclipse里面的项目移植到intellij idea里面
怎么关联多个库 . A B C D,A依赖BC,D依赖A,怎么搞? 注意: as和idea里面,project是工作空间的意思,这里面model才是项目. 打开主项目D 打开已经存在的model 导 ...
- HttpClient, 使用C#操作Web
我们知道, .Net类库里提供了HttpWebRequest等类,方便我们编程与Web服务器进行交互. 但是实际使用中我们经常会遇到以下需求,基础类里没有直接提供相应的功能(WebClient类包含这 ...
- ReactNative之style使用指南
ReactNative中能使用的css样式有哪些呢Valid style props: [ "alignItems", "alignSelf", & ...
- [CareerCup] 11.1 Merge Arrays 合并数组
11.1 You are given two sorted arrays, A and B, where A has a large enough buffer at the end to hold ...