ApplicationContextAware和BeanFactoryAware获取bean实例

    技术2025-03-17  47

    这两个接口在项目中的使用,主要是为了动态获取实例对象,两种场景

    第一种:获取的实例对象都实现了相同的接口或者继承了相同的父类,这样就可以实现代码的整洁复用;

    第二种:比如方法的调用,类里边的方法相互调用,如果想使用自定义注解的话,是不会生效的,但是如果借用ApplicationContextAware和BeanFactoryAware接口的方法实现,则可以让自定义注解生效,因为重新动态获取了一次实例;

    使用说明:必须保证SpringContextUtil该类被Spring容器管理,不然不会生效,会报空指针异常;使用注解扫描或者定义bean标签注入;

    <bean id="springContextUtil" class="com.yuan.SpringContextUtil"/>

    SpringContextUtil.getBean(“aController”,AController.class)

    SpringContextUtil类

    public class SpringContextUtil implements ApplicationContextAware { // Spring应用上下文环境 private static ApplicationContext applicationContext; /** * 实现ApplicationContextAware接口的回调方法,设置上下文环境 */ public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { SpringContextUtil.applicationContext = applicationContext; } public static ApplicationContext getApplicationContext() { return applicationContext; } /** * 获取对象 这里重写了bean方法,起主要作用 * * @param beanId * @return Object 一个以所给名字注册的bean的实例 * @throws BeansException */ public static <T> T getBean(String beanId) throws BeansException { return (T)applicationContext.getBean(beanId); } /** * 获取对象 这里重写了bean方法,起主要作用 * * @param beanId * @return Object 一个以所给名字注册的bean的实例 * @throws BeansException */ public static <T> T getBean(String beanId,Class<T> beanClass) throws BeansException { return (T)applicationContext.getBean(beanId,beanClass); } } public class SpringContextUtil implements BeanFactoryAware { private static BeanFactory beanFactory; /** * 实现BeanFactory接口的回调方法,设置上下文环境 */ @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { this.beanFactory=beanFactory; } /** * 获取对象 这里重写了bean方法,起主要作用 * * @param beanId * @return Object 一个以所给名字注册的bean的实例 * @throws BeansException */ public static <T> T getBean(String beanId) throws BeansException { return (T)beanFactory.getBean(beanId); } /** * 获取对象 这里重写了bean方法,起主要作用 * * @param beanId * @return Object 一个以所给名字注册的bean的实例 * @throws BeansException */ public static <T> T getBean(String beanId,Class<T> beanClass) throws BeansException { return (T)beanFactory.getBean(beanId,beanClass); } }

    以下方式也可以:

    @Resource private ApplicationContext applicationContext; applicationContext.getBean()
    Processed: 0.009, SQL: 9