我自横刀向天笑,去留肝胆两昆仑。这篇文章主要讲述Spring:利用ApplicationContextAware装配Bean相关的知识,希望能为你提供帮助。
使用xml、注解的形式装配Bean,因其方便快捷,受到大家喜爱。一般形式如下:
1 @Autowired 2 private BeanObjectInterface beanObject;
然而在某些特别场景下,既需要将对象作为Bean交于Spring管理,又需要在代码中即时地获取Bean,用注解形式进行装配就不太能满足需求。
查找资料,Spring提供了 ApplicationContextAware 接口,便于实时地获取Bean。
【Spring(利用ApplicationContextAware装配Bean)】首先,创建一个 Util 类,继承 ApplicationContextAware 接口:
1 public class SpringContextUtil implements ApplicationContextAware { 2 3//Spring应用上下文环境 4private static ApplicationContext applicationContext; 5 6/** 7* 实现ApplicationContextAware接口的回调方法,设置上下文环境 8* @param applicationContext 9* @throws BeansException 10*/ 11public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 12SpringContextUtil.applicationContext = applicationContext; 13} 14 15public static ApplicationContext getApplicationContext(){ 16return applicationContext; 17} 18 19/** 20* 获取对象 21* @param name 22* @return Object 一个以类型 23* @throws BeansException 24*/ 25 26public static Object getBean(Class requiredType) throws BeansException { 27return applicationContext.getBean(requiredType); 28} 29 30/** 31* 获取对象 32* @param name 33* @return Object 一个以所给名字注册的bean的实例 34* @throws BeansException 35*/ 36public static Object getBean(String name) throws BeansException { 37return applicationContext.getBean(name); 38} 39 40/** 41* 获取类型为requiredType的对象 42* 如果bean不能被类型转换,相应的异常将会被抛出(BeanNotOfRequiredTypeException) 43* @param namebean注册名 44* @param requiredType 返回对象类型 45* @return Object 返回requiredType类型对象 46* @throws BeansException 47*/ 48public static Object getBean(String name, Class requireType) throws BeansException{ 49return applicationContext.getBean(name, requireType); 50} 51 52/** 53* 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true 54* @param name 55* @return boolean 56*/ 57public static boolean containsBean(String name){ 58return applicationContext.containsBean(name); 59} 60 61/** 62* 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 63* 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException) 64* @param name 65* @return boolean 66* @throws NoSuchBeanDefinitionException 67*/ 68public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException { 69return applicationContext.isSingleton(name); 70} 71 72/** 73* @param name 74* @return Class 注册对象的类型 75* @throws NoSuchBeanDefinitionException 76*/ 77public static Class getType(String name) throws NoSuchBeanDefinitionException { 78return applicationContext.getType(name); 79} 80 81/** 82* 如果给定的bean名字在bean定义中有别名,则返回这些别名 83* @param name 84* @return 85* @throws NoSuchBeanDefinitionException 86*/ 87public static String[] getAliases(String name) throws NoSuchBeanDefinitionException { 88return applicationContext.getAliases(name); 89} 90 91 }
然后在 appcontext.xml 文件中添加相应的bean配置,使得Spring可以在项目启动时加载 SpringContextUtil ,完成 applicationContext 的初始化。
如果是使用注解扫描形式加载bean,则需要在 SpringContextUtil 上方标注 @Component:
1 @Component 2 public class SpringContextUtil implements ApplicationContextAware { 3// ... 内容不再赘述 4 }
References:
https://www.jianshu.com/p/4145f507f3e7 http://blog.kazaff.me/2014/12/05/@Scope(prototype)%E7%9A%84%E6%AD%A3%E7%A1%AE%E7%94%A8%E6%B3%95/ https://www.ktanx.com/blog/p/326 p.s. 还有一篇简书博客找不到了。其实很多方法是从那里学来的
推荐阅读
- CSAPP实验之Data Lab
- callapplybind不同使用场景
- Android图像处理 - 高斯模糊的原理及实现
- Ubuntu 16.04下为Android编译OpenCV 3.2.0 Manager
- 挂载报错(“/dev/vda1 is apparently in use by the system;”)
- appium 架构原理
- macAndroid Studio 真机测试 配置
- 阅读《Android 从入门到精通》(10)——单项选择
- [FMX]将 Android 程序切换到后台及从后台切换到前台实现