Spring 容器最基本最基本的接口就是BeanFactory。BeanFactory負責配置,建立、配置Bean,其中有一個子接口ApplicationContext,也被稱爲Spring上下文。容器同時還管理這Bean和Bean之間的依賴關係
app
Spring IoC容器的實現,從根源上是BeanFactory,可是真正做爲一個能夠獨立使用的IoC容器的仍是DefaultListableBeanFactory所以能夠說DefaultListableBeanFactory是整個Spring IoC的始祖ide
上一篇文章簡單闡述Spring的依賴查找方式ui
經過Bean 名稱查找. this
Object getBean(String name)spa
經過Bean 的類型查找 code
<T> T getBean(Class<T> requiredType)orm
經過Bean 的名稱+類型組合查找xml
<T> T getBean(String name, Class<T> requiredType)對象
經過註解查找blog
Map<String, Object> getBeansWithAnnotation(Class<? extendsAnnotation> annotationType)
若是說BeanFactory 是Spring 的心臟,那麼ApplicationContext就是完美的身軀,繼承BeanFactory接口,除了包含BeanFactory的全部功能以外。在國際化、資源訪問(如:URL和文件)、事件傳播等方面進行了良好支持
在獲取ApplicationContext實例後,就能夠像BeanFactory同樣調用getBean(beanName)返回Bean了。ApplicationContext的初始化和BeanFactory有一個重大的區別:BeanFactory在初始化容器時,並未實例化Bean,直到第一次訪問某個Bean時才實例化目標Bean;而ApplicationContext則在初始化應用上下文時就實例化全部單實例的Bean,經過ApplicationContext的依賴樹圖,不難發現Spring Bean的依賴注入來源
自定義的Bean
依賴注入Bean (如:內建依賴 BeanFactory)
容器內建依賴 Bean (如:容器內建 Environment)
依賴注入案例
public class UserRepository { private Collection<User> users; // 自定義 Bean private BeanFactory beanFactory; // 內建非 Bean 對象(依賴) private ObjectFactory<ApplicationContext> objectFactory; public Collection<User> getUsers() { return users; } public void setUsers(Collection<User> users) { this.users = users; } public void setBeanFactory(BeanFactory beanFactory) { this.beanFactory = beanFactory; } public BeanFactory getBeanFactory() { return beanFactory; } public ObjectFactory<ApplicationContext> getObjectFactory() { return objectFactory; } public void setObjectFactory(ObjectFactory<ApplicationContext> objectFactory) { this.objectFactory = objectFactory; }}
public class DependencyInjectionDemo {
public static void main(String[] args) { // 啓動 Spring 應用上下文 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:/META-INF/dependency-injection-context.xml");
// 依賴來源一:自定義 Bean UserRepository userRepository = applicationContext.getBean("userRepository", UserRepository.class);
// 依賴來源二:依賴注入(內建依賴) System.out.println(userRepository.getBeanFactory());
ObjectFactory<ApplicationContext> userFactory = userRepository.getObjectFactory(); System.out.println(userFactory.getObject() == applicationContext);
// 依賴來源三:容器內建 Bean Environment environment = applicationContext.getBean(Environment.class); System.out.println("獲取 Environment 類型的 Bean:" + environment); }}