在Spring中,Bean的实例化、定位、配置应用程序中的对象及建立对象间的依赖关系,都是在IoC容器中进行的。因此,要在Spring中获取Bean,本质上就是从IoC容器当中获取Bean。

那获取Bean的方式有哪些呢?我们总结整理了以下几点:

  • 1、基于注解获取Bean
  • 2、基于BeanFactory获取Bean
  • 3、基于ApplicationContext获取bean

1.基于注解获取Bean

我们最常见的使用方式,应该就是通过注解获取Bean了。

@Component
public class SpringContextUtil {
    
    @Autowired
    private SysUserService sysUserService;
    
    public void test(){
        sysUserService.test();
    }
}

例如使用@Autowired注解来注入sysUserService 。

2.基于BeanFactory获取Bean

存在一些场景,我们无法通过注解来获取bean的时候,可以选择基于BeanFactory来获取。

@Component
public class SpringContextUtil implements BeanFactoryAware {


    private static BeanFactory beanFactory;


    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }


    public static <T> T getBean(Class<T> requiredType) {
        return beanFactory.getBean(requiredType);
    }
}

通过实现BeanFactoryAware接口,重写setBeanFactory方法,来给本地属性beanFactory赋值,在后续的使用过程中,直接通过调用SpringContextUtil.getBean()即可实现bean的获取。

3.基于ApplicationContext获取bean

通过ApplicationContext的方式获取bean,我们列举一种比较常见的方式。

@Component
public class SpringContextUtil implements ApplicationContextAware {


    private static ApplicationContext applicationContext;


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


    }
    public static <T> T getBean(Class<T> clazz) {
        T bean = applicationContext.getBean(clazz);
        return bean;
    }
}

通过实现ApplicationContextAware接口,在Spring容器启动时将ApplicationContext注入进去,在后续的使用过程中,直接通过调用SpringContextUtil.getBean()即可实现bean的获取。

在整理Spring中通过ApplicationContext获取bean的内容的时候,发现网上介绍了很多中获取bean的方式,但是总结下来看,其实本质上是相似的,例如:

  • 1、继承ApplicationObjectSupport类
  • 2、继承WebApplicationObjectSupport类

底层都是通过implements ApplicationContextAware的方式,来获取ApplicationContext,从而通过getBean()获取bean对象。