springboot获取bean的几种常用方式
集成redis时,需要经常操作StringRedisTemplate,直接使用StringRedisTemplate,操作不便,需要依赖注入,工具类封装,调整为静态方法,便于各处调用,因此需要获取上下文,便于工具使用。
本文主要从3个方面,共计5种常用的方式获取上下文,从而获取bean。
一、第一个主要方面为,启动项目时,通过保存 ApplicationContext。
1.xml手动配置方式,获取容器
// 其中applicationContext.xml 为配置容器的xml,不过现在一般很少使用了
ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");
2.springboot主入口启动时,保存上下文
@SpringBootApplication
public class RedisexampleApplication {
public static void main(String[] args) {
// 启动时,保存上下文,并保存为静态
ConfigurableApplicationContext applicationContext = SpringApplication.run(RedisexampleApplication.class, args);
SpringContextUtil1.setAc(applicationContext);
}
}
/**
* 第一种
* spring获取bean
* 通过保存ApplicationContext对象
*
* @author object
* @since 2022年6月15日
*/
public class SpringContextUtil1 {
private static ApplicationContext ac;
public static <T> T getBean(String beanName, Class<T> clazz) {
// 行不通,报错,需要配置文件方式初始化spring的情况
// ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");
T bean = ac.getBean(beanName, clazz);
return bean;
}
public static void setAc(ApplicationContext applicationContext){
ac = applicationContext;
}
}
二、第二个方面主要通过继承的spring提供的接口或者类
1.通过实现ApplicationContextAware
推荐!!
/**
* 第三种
* spring获取bean
* 通过实现ApplicationContextAwre方式
*
* @author object
* @since 2022年6月15日
*/
@Component
public class SpringContextUtil3 implements ApplicationContextAware {
private static ApplicationContext ac;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ac = applicationContext;
}
public static <T> T getBean(Class<T> clazz) {
T bean = ac.getBean(clazz);
return bean;
}
}
2.通过继承ApplicationObjectSupport
/**
* 第四种
* spring获取bean
* 通过继承ApplicationObjectSupport
*
* @author object
* @since 2022年6月15日
*/
@Service
public class SpringContextUtil4 extends ApplicationObjectSupport {
public <T> T getBean(Class<T> clazz) {
T bean = getApplicationContext().getBean(clazz);
return bean;
}
}
3.通过继承WebApplicationObjectSupport
/**
* 第五种
* spring获取bean
* 通过继承WebApplicationObjectSupport
*
* @author object
* @since 2022年6月15日
*/
@Service
public class SpringContextUtil5 extends WebApplicationObjectSupport {
public <T> T getBean(Class<T> clazz) {
T bean = getApplicationContext().getBean(clazz);
return bean;
}
}
三、通过spring提供的静态方法获取上下文
1.通过WebApplicationContextUtils,适用于web项目的b/s结构
/**
* 第二种
* spring获取bean
* 通过servletContext获取bean
*
* @author object
* @since 2022年6月15日
*/
public class SpringContextUtil2 {
public static <T> T getBean(ServletContext request, String name, Class<T> clazz){
WebApplicationContext webApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(request);
// 或者
WebApplicationContext webApplicationContext1 = WebApplicationContextUtils.getWebApplicationContext(request);
// webApplicationContext1.getBean(name, clazz)
T bean = webApplicationContext.getBean(name, clazz);
return bean;
}
}
其它:
2.通过ContextLoader获取WebApplicationContext,获取上下文,由于调试中,并没有调试成功,返回值为null,应该和项目的启动方式有关,需要使用特定的方式初始化,这里不做延伸。
对各个方式的使用,做如下列表示例:
StringRedisTemplate为特殊依赖类,自测时,使用自定义的类,并在容器中注册的类即可。
注意:SpringContextUtil4和SpringContextUtil5需要依赖注入,主要是实现父类方法,父类方法为非静态方法。
@RequestMapping("/test")
@RestController(value = "/test")
public class TestApi {
@Autowired
TestService testService;
@Autowired
SpringContextUtil4 springContextUtil4;
@Autowired
SpringContextUtil5 springContextUtil5;
@RequestMapping("/getobject/{key}")
public User getObject(HttpServletRequest request, @PathVariable(value = "key") String key) {
// 第一种
StringRedisTemplate bean1 = SpringContextUtil1.getBean("stringRedisTemplate", StringRedisTemplate.class);
// 第二种
StringRedisTemplate bean2 = SpringContextUtil2.getBean(request.getServletContext(), "stringRedisTemplate", StringRedisTemplate.class);
// 第三种
StringRedisTemplate bean3 = SpringContextUtil3.getBean(StringRedisTemplate.class);
// 第四种
StringRedisTemplate bean4 = springContextUtil4.getBean(StringRedisTemplate.class);
// 第五种
StringRedisTemplate bean5 = springContextUtil5.getBean(StringRedisTemplate.class);
return testService.getObject(key);
}
}
调用该方式,展示获取结果:==由于贴图始终贴不上,相当郁闷,那就没办法了,看来博客的编辑器还是有问题,只能直接展示代码==
五种方式均获取成功。
- 点赞
- 收藏
- 关注作者
评论(0)