怎样在普通类中调用Bean?

1,119 阅读2分钟

src=http___img.it610.com_image_product_eb2b2217af864820902cf7a476e6218d.jpg&refer=http___img.it610.webp
本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

       在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);
}
}

后言

       既然看到这里了,感觉有所收获的朋友,不妨来个大大的点赞吧~~~