spring服务定位器,可在任何地方获取bean

通过持有的Spring应用场景ApplicationContext,可在任何地方获取bean。

 1 import org.apache.commons.logging.Log;
 2 import org.apache.commons.logging.LogFactory;
 3 import org.springframework.beans.factory.DisposableBean;
 4 import org.springframework.context.ApplicationContext;
 5 import org.springframework.context.ApplicationContextAware;
 6
 7 /**
 8  * 服务定位器
 9  * 持有Spring的应用场景, 可在任何地方获取bean.
10  */
11 public final class ServiceLocator implements ApplicationContextAware, DisposableBean {
12
13     private static Log logger = LogFactory.getLog(ServiceLocator.class);
14     private static ApplicationContext context = null;
15
16     /**
17      * 实现ApplicationContextAware接口, 注入Context到静态变量中.
18      * @param context
19      */
20     @Override
21     public void setApplicationContext(ApplicationContext context) {
22         logger.debug("Injected the ApplicationContext into ServiceLocator:" + context);
23         if (ServiceLocator.context != null) {
24             logger.debug("[------------ ApplicationContext in the ServiceLocator " +
25                                 "is covered, as the original ApplicationContext is:"
26                                             + ServiceLocator.context + " ------------]");
27         }
28         ServiceLocator.context = context;
29     }
30
31     /**
32      * 实现DisposableBean接口,在Context关闭时清理静态变量.
33      */
34     @Override
35     public void destroy() throws Exception {
36         ServiceLocator.clear();
37     }
38
39     /**
40      * 取得存储在静态变量中的ApplicationContext.
41      * @return
42      */
43     public static ApplicationContext getApplicationContext() {
44         assertContextInjected();
45         return context;
46     }
47
48     /**
49      * 从Spring的应用场景中取得Bean, 自动转型为所赋值对象的类型.
50      * @param name bean名称
51      * @return bean对象
52      */
53     @SuppressWarnings("unchecked")
54     public static <T> T getService(String name) {
55         assertContextInjected();
56         return (T) context.getBean(name);
57     }
58
59     /**
60      * 从Spring的应用场景中取得Bean, 自动转型为所赋值对象的类型.
61      * @param requiredType bean类
62      * @return bean对象
63      */
64     public static <T> T getService(Class<T> requiredType) {
65         assertContextInjected();
66         return context.getBean(requiredType);
67     }
68
69     /**
70      * 清除ServiceLocator中的ApplicationContext
71      */
72     public static void clear() {
73         logger.debug("Clear ApplicationContext in ServiceLocator :" + context);
74         context = null;
75     }
76
77     /**
78      * 检查ApplicationContext不为空.
79      */
80     private static void assertContextInjected() {
81         if (context == null) {
82             throw new IllegalStateException("ApplicaitonContext not injected, " +
83                             "as defined in the context.xml ServiceLocator");
84         }
85     }
86 }

调用getService函数,分为按名称和类型获取。

 1     /**
 2      * 从Spring的应用场景中取得Bean, 自动转型为所赋值对象的类型.
 3      * @param name bean名称
 4      * @return bean对象
 5      */
 6     @SuppressWarnings("unchecked")
 7     public static <T> T getService(String name) {
 8         assertContextInjected();
 9         return (T) context.getBean(name);
10     }
11
12     /**
13      * 从Spring的应用场景中取得Bean, 自动转型为所赋值对象的类型.
14      * @param requiredType bean类
15      * @return bean对象
16      */
17     public static <T> T getService(Class<T> requiredType) {
18         assertContextInjected();
19         return context.getBean(requiredType);
20     }
时间: 2024-10-11 11:06:40

spring服务定位器,可在任何地方获取bean的相关文章

在spring项目中,普通类注入获取Bean,实现ApplicationContextAware接口

在平时spring项目中,某个不能注入Bean的项目中要获取Bean. @Component public class SpringUtil implements ApplicationContextAware { private static ApplicationContext applicationContext = null; public SpringUtil() { } public void setApplicationContext(ApplicationContext arg0

【设计模式】服务定位器模式

服务定位器模式(Service Locator Pattern)用在我们想使用 JNDI 查询定位各种服务的时候.考虑到为某个服务查找 JNDI 的代价很高,服务定位器模式充分利用了缓存技术.在首次请求某个服务时,服务定位器在 JNDI 中查找服务,并缓存该服务对象.当再次请求相同的服务时,服务定位器会在它的缓存中查找,这样可以在很大程度上提高应用程序的性能.以下是这种设计模式的实体. 服务(Service) - 实际处理请求的服务.对这种服务的引用可以在 JNDI 服务器中查找到. Conte

[原创]java WEB学习笔记98:Spring学习---Spring Bean配置及相关细节:如何在配置bean,Spring容器(BeanFactory,ApplicationContext),如何获取bean,属性赋值(属性注入,构造器注入),配置bean细节(字面值,包含特殊字符,引用bean,null值,集合属性list map propert),util 和p 命名空间

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

spring和hibernate整合时报sessionFactory无法获取默认Bean Validation factory

Hibernate 3.6以上版本在用junit测试时会提示错误: Unable to get the default Bean Validation factory spring和hibernate整合时报sessionFactory无法获取默认Bean Validation factory  ,是因为新版hibernate用到新的jar包造成的,默认会自动找验证包,吴国不需要这一步,可以在spring整合hibernate的配置节点中添加如下标红属性: <bean id="sessio

使用反射创建Bean、Spring中是如何根据类名配置创建Bean实例、Java提供了Class类获取类别的字段和方法,包括构造方法

Java提供了Class类,可以通过编程方式获取类别的字段和方法,包括构造方法 获取Class类实例的方法: 类名.class 实例名.getClass() Class.forName(className) public class RefTest { @Test public void testRef(){ //Class cls = RefTest.class; //Class.forName("com.jboa.service.RefTest"); //new RefTest()

[翻译] 服务定位器是反模式

原文:Service Locator is an Anti-Pattern 服务定位器模式广为人知,Martin Fowler在文章中专门描述过它.所以它一定是好的,对不对? 并不是这样.服务定位器实际上是个反模式,应该避免使用.我们来研究一下.简单来讲,服务定位器隐藏了类之间的依赖关系,导致错误从编译时推迟到了运行时,并且,在引入破坏性更改时,这个模式导致代码不清晰,增加了维护难度. OrderProcessor 示例 我们用依赖注入话题中常见的OrderProcessor示例作说明.Orde

Spring基础系列14 -- Spring MVC 请求参数的几种获取方法

Spring MVC 请求参数的几种获取方法 转载:http://www.cnblogs.com/leiOOlei/p/3658147.html 一.      通过@PathVariabl获取路径中的参数 @RequestMapping(value="user/{id}/{name}",method=RequestMethod.GET) public String printMessage1(@PathVariable String id,@PathVariable String n

YII服务定位器依赖注入

<?php /** * Created by PhpStorm. * Date: 2016/5/25 * Time: 18:33 * 服务定位器依赖注入 */ namespace frontend\controllers; use yii; use yii\web\Controller; use yii\di\Container; use yii\di\ServiceLocator; class DependencyinjectserviceController extends Controll

spring 获取 bean

ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletActionContext.getServletContext()); TopicAction result = (TopicAction)ac1.getBean("TopicAction"); spring 获取 bean