• Spring:利用ApplicationContextAware装配Bean


    使用xml、注解的形式装配Bean,因其方便快捷,受到大家喜爱。一般形式如下:

    1 @Autowired
    2 private BeanObjectInterface beanObject;

    然而在某些特别场景下,既需要将对象作为Bean交于Spring管理,又需要在代码中即时地获取Bean,用注解形式进行装配就不太能满足需求。

    查找资料,Spring提供了 ApplicationContextAware 接口,便于实时地获取Bean。

    首先,创建一个 Util 类,继承 ApplicationContextAware 接口:

     1 public class SpringContextUtil implements ApplicationContextAware {
     2 
     3     //Spring应用上下文环境
     4     private static ApplicationContext applicationContext;
     5 
     6     /**
     7      * 实现ApplicationContextAware接口的回调方法,设置上下文环境
     8      * @param applicationContext
     9      * @throws BeansException
    10      */
    11     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    12         SpringContextUtil.applicationContext = applicationContext;
    13     }
    14 
    15     public static ApplicationContext getApplicationContext(){
    16         return applicationContext;
    17     }
    18 
    19     /**
    20      * 获取对象
    21      * @param name
    22      * @return Object 一个以类型
    23      * @throws BeansException
    24      */
    25 
    26     public static Object getBean(Class requiredType) throws BeansException {
    27         return applicationContext.getBean(requiredType);
    28     }
    29 
    30     /**
    31      * 获取对象
    32      * @param name
    33      * @return Object 一个以所给名字注册的bean的实例
    34      * @throws BeansException
    35      */
    36     public static Object getBean(String name) throws BeansException {
    37         return applicationContext.getBean(name);
    38     }
    39 
    40     /**
    41      * 获取类型为requiredType的对象
    42      * 如果bean不能被类型转换,相应的异常将会被抛出(BeanNotOfRequiredTypeException)
    43      * @param name       bean注册名
    44      * @param requiredType 返回对象类型
    45      * @return Object 返回requiredType类型对象
    46      * @throws BeansException
    47      */
    48     public static Object getBean(String name, Class requireType) throws BeansException{
    49         return applicationContext.getBean(name, requireType);
    50     }
    51 
    52     /**
    53      * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
    54      * @param name
    55      * @return boolean
    56      */
    57     public static boolean containsBean(String name){
    58         return applicationContext.containsBean(name);
    59     }
    60 
    61     /**
    62      * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。
    63      * 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
    64      * @param name
    65      * @return boolean
    66      * @throws NoSuchBeanDefinitionException
    67      */
    68     public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
    69         return applicationContext.isSingleton(name);
    70     }
    71 
    72     /**
    73      * @param name
    74      * @return Class 注册对象的类型
    75      * @throws NoSuchBeanDefinitionException
    76      */
    77     public static Class getType(String name) throws NoSuchBeanDefinitionException {
    78         return applicationContext.getType(name);
    79     }
    80 
    81     /**
    82      * 如果给定的bean名字在bean定义中有别名,则返回这些别名
    83      * @param name
    84      * @return
    85      * @throws NoSuchBeanDefinitionException
    86      */
    87     public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
    88         return 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:

    p.s. 还有一篇简书博客找不到了。其实很多方法是从那里学来的
  • 相关阅读:
    【2017下长沙学院软工3班_助教博客】 第一次作业成绩公示
    《构建之法》读书笔记第3章
    《构建之法》读书笔记第1、2章
    【2017下集美大学软件工程1413软工实践_助教博客】 第0次作业成绩公示
    软件工程——构建之法高分Tips
    第09组 Alpha冲刺(1/6)
    2019 SDN上机第2次作业
    第09组 团队Git现场编程实战
    2019 SDN上机第一次作业
    第09组 团队项目-需求分析报告
  • 原文地址:https://www.cnblogs.com/tflowingcloud/p/8443010.html
Copyright © 2020-2023  润新知