行业资讯 2025年08月6日
0 收藏 0 点赞 319 浏览 2291 个字
摘要 :

文章目录 方法1:通过实现ServletContextListener接口 方法2:通过实现ApplicationContextAware 接口 方法3:手动创建ApplicationContext对象 最近在开发的时候,由于……




  • 方法1:通过实现ServletContextListener接口
  • 方法2:通过实现ApplicationContextAware 接口
  • 方法3:手动创建ApplicationContext对象

最近在开发的时候,由于经常用到多线程,在线程中无法通过@Autowired方式注解注入ApplicationContext中的bean,因为线程类一般不会交给spring管理,必须要使用手工获取spring bean对象的方法才能较好得实现相应的功能。

那怎么实现手动获取springApplicationContext中的bean对象呢?

方法1:通过实现ServletContextListener接口

我们只需要写一个监听类,实现ServletContextListener接口,然后重写里面的抽象方法即可,具体如下:

public class SpringContextListener implements ServletContextListener {
    
    private static ApplicationContext springContext;
    
    /**
     * 销毁方法
     */
    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        // 可以不管
    }

    /**
     * 初始化方法
     */
    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        springContext = WebApplicationContextUtils.getWebApplicationContext(arg0.getServletContext());
    }
    
    public static ApplicationContext getApplicationContext() {
            return springContext;
        }
 
        public static void setApplicationContext(ApplicationContext cxt) {
            springContext = cxt;
        }
    
}

然后再其他类中只要使用如下方法获取即可:

XXService service= SpringContextListener.getApplicationContext().getBean(XXService.class);

方法2:通过实现ApplicationContextAware 接口

@Component
public class SpringContextUtils implements ApplicationContextAware {

    /**
     * 上下文对象实例
     */
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextUtils.applicationContext = applicationContext;
    }

    /**
     * 获取applicationContext
     *
     * @return
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 通过name获取 Bean.
     *
     * @param name
     * @return
     */
    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);
    }

    /**
     * 通过class获取Bean.
     *
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }

    /**
     * 通过name,以及Clazz返回指定的Bean
     *
     * @param name
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(String name, Class<T> clazz) {
        return getApplicationContext().getBean(name, clazz);
    }
}

注意:写完了工具类,还需要在applicationContext.xml中配置 一行,让Spring进行对象管理:

<bean id="pringContextUtils" class="com.panziye.util.SpringContextUtils" lazy-init="false" />  

或者也可以直接用注解的方式,在类上注解@Component,在上列代码中我们就用的此方式。

方法3:手动创建ApplicationContext对象

这种方法一般适用于junit单元测试,也是学习spring的入门方法,可以了解下,web项目还是尽量使用上面的两种方法:

ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");

有了ApplicationContext就都可以根据getBean方法获取对应的管理对象了。

手动获取spring bean对象其实也并不是很难,代码也是比较简单,你掌握了吗?

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/8122.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号