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 的类型查找 3d
<T> T getBean(Class<T> requiredType)code
经过Bean 的名称+类型组合查找orm
<T> T getBean(String name, Class<T> requiredType)xml
经过注解查找对象
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); }}