在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对象。