本文已参与「新人创作礼」活动,一起开启掘金创作之路。
前言
在Spring框架中,如果当前类也是受Spring容器管理的,我们可以通过@Autowired、@Resource等方式,快速的将我们要引用的Bean注入到当前类中,然后进行业务处理。
但是在实际业务场景中,可能存在一些特殊情况,例如:一个普通类没有受Spring容器管理,但是却需要调用Spring容器中的Bean。这种情况下,我们该如何处理?而本篇文章所提供的工具,就是为了解决这个问题而设计的。
使用Spring注入会出现的问题
由于当前类没有接受Spring容器管理,在使用@Autowired、@Resource等方式进行注入的时候,会发现根本无法注入。
解决方案
如果有写过Spring框架独立应用程序的同学应该知道,在Spring应用中,我们可以通过ApplicationContext来获取到Spring容器中的Bean,那我们要如何获取到ApplicationContext呢?这就要用到ApplicationContextAware接口了。
在ApplicationContextAware接口中,有一个setApplicationContext方法,入参是ApplicationContext,我们只要实现ApplicationContextAware接口,并重写setApplicationContext方法,就能获取到ApplicationContext,继而也就能根据ApplicationContext获取到Bean了。
具体代码如下:
@Component
public class SpringContextHolder implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext context) throws BeansException {
SpringContextHolder.applicationContext = context;
}
// 通过类型获取Bean
public static <T> T getBean(Class<T> requiredType){
return applicationContext.getBean(requiredType);
}
// 通过Bean名称获取Bean
public static <T> T getBean(String name){
return (T) applicationContext.getBean(name);
}
}
调用方式如下:
public class UserUtils {
// 从容器中获取Bean
private static final UserService userService = SpringContextHolder.getBean("userService");
// 根据用户编号获取用户信息
public static User getUser(String id){
return userService.findById(id);
}
}
后言
既然看到这里了,感觉有所收获的朋友,不妨来个大大的点赞吧~~~