BeanFactory接口
Interface BeanFactory
getBean
<T> T getBean(String name,
Class<T> requiredType)
throws BeansException
上面是Apring的bean工厂的接口(顾名思议 拿到Spring的Bean) 下面看它的一个实现类
ClassPathXmlApplicationContext(BeanFactory接口的一个实现类)
public ClassPathXmlApplicationContext(String configLocation)
throws BeansException
- Create a new ClassPathXmlApplicationContext, loading the definitions from the given XML file and automatically refreshing the context.
- 构造方法的参数 是Spring Bean配置的xml路径(src下面的路径)
- 然后 我们就可以通过new 一个ClassPathXmlApplicationContext 然后调用BeanFactory的getBean()方法获取Spring管理的Bean了
上面只是通过API说了Spring获取Bean的原理,然而工作中:
在平时代码中 我们都是通过 @Autowired 来引入一个对象。也就是Spring的依赖注入。
不过使用依赖注入需要满足两个条件,注入类 和被注入类 都需要交给Spring去管理,也就是需要在Spring中配置Bean
但是开发中,有些工具类(或者实体类)是不需要在Spring中配置的,如果工具类里面 想引用Spring配置的Bean 应该怎么办
解决办法
自己用的时候主动去new。 不可取 自己new的类 没有交给Spring去管理,如果类中 用到了Spring的一些注解功能 完全失效
也不可能像上面API中 去通过XML拿(IO操作很费时间)
工作中使用ApplicationContextAware接口
先通过setApplicationContext获取Spring的上下文
在通过applicationContext去获取Spring管理的Bean
写一个SpringContextUtils专门去获取Spring管理的Bean。也就是说 被注入对象 可以不交给Spring管理,就可以获取Spring管理的Bean
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware; public class SpringContextUtils implements ApplicationContextAware { private static ApplicationContext applicationContext;
/**
* 如果实现了ApplicationContextAware接口,在Bean的实例化时会自动调用setApplicationContext()方法
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext)throws BeansException {
SpringContextUtils.applicationContext = applicationContext;
} public static <T> T getBean(Class<T> clazz) {
return applicationContext.getBean(clazz);
} }
注意点
SpringContextUtils必须在Spring中配置bean(也就是SpringContextUtils必须交给Spring管理) 不然 在Bean的实例化时不会自动调用setApplicationContext()方法
SpringContextUtils中的ApplicationContext需要是static的
这样 我们就可在任何代码任何地方任何时候中取出ApplicaitonContext. 从而获取Spring管理的Bean