【springboot】在普通类中获取spring容器中的bean_may的博客的博客-爱代码爱编程
这段时间公司搞封闭开发,做一个联通总部的客服系统项目,是基于springboot的。在开发工程中遇到一个页面datagrid数据排序的功能,因为有多个表的数据都要用到排序功能,于是我就写了一个排序功能的公共实现类,方便大家使用。在写实现类的过程中学习了在普通类中获取spring容器中的bean的方法。
如果我们需要在一个类中使用spring提供的bean对象,那么我们需要把这个bean注入到spring容器中,交给spring容器来管理。但是在实际应用中我们往往会碰到在普通的java类中,需要直接使用spring提供的对象或者说有一些对象不需要交给spring容器来管理,但是需要用到spring容器中的一些对象。
如果这是spring框架的独立应用程序,我们通过ApplicationContext对象即可获取到:
ApplicationContext applicationContext = new FileSystemXmlApplicationContext("applicationContext.xml");
applicationContext.getBean("beanId");
但是在实际应用中,我们做的项目大多是web application,在web application中我们启动spring容器是通过在web.xml中进行配置,这样就不适合使用上面的方式在普通类去获取对象了,因为这样做就相当于加载了两次spring容器,而我们想是否可以通过在启动web服务器的时候,就把Application放在某一个类中,我们通过这个类在获取,这样就可以在普通类获取spring bean对象了。
在springboot中有一种实现方式,可以很方便的获取到ApplicationContext对象:SpringBoot平台下采用ApplicationContextAware的方式完成ApplicationContext实例的获取,并通过ApplicationContext实例完成对Spring管理的Bean实例手动获取。
创建一个实体类SpringUtil并实现ApplicationContextAware接口,重写接口内的setApplicationContext方法来完成获取ApplicationContext实例的方法。
如下为ApplicationContextAware接口:
具体实现请参见我的Github:SpringBoot在普通类中获取spring容器中的bean
注意两个地方:
1、SpringUtil类上的 @Component注解必须要有,否则spring就不会自动调用setApplicationContext方法来为我们设置上下文实例;
2、SpringUtil类要在springboot可以扫描到的包下;