BeanFactory的类结构
ListableBeanFactory:该接口定义了访问容器中Bean基本信息的若干方法,如查看Bean的个数,获取某一类型Bean的个数、获取某一类型Bean的配置名、查看容器中是否包含某一类型的Bean等
HierarchicalBeanFactory:父子级联Ioc容器接口,子容器通过接口方法访问父容器
ConfigurableBeanFactory:这是一个重要的接口,增强了Ioc容器的可定制性。它定义了设置类转载器、属性编辑器、容器初始化后置处理器方法等
AutowireCapableBeanFactory:定义了将容器中的Bean按某种规则(如名字匹配或类型匹配) 进行自动装配
SingletonBeanRegistry:定义了在运行期向容器注册单实例Bean的方法
BeanDefinitionRegistry Spring配置文件中每一个<bean> 节点元素在Spring容器里都通过一个BeanDefinition对象表示,它描述了Bean的配置信息,而 BeanDefinitionRegistry接口提供了向容器手工注册BeanDefinition对象的方法
案例 初始化BeanFactory 通过Spring配置文件为Car提供配置,然后通过BeanFactory装载配置文件,启动SpringIoc 容器
beans.xml文件 Car配置文件
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"> <bean id="car1" class="com.smart.Car" init-method="myInit" destroy-method="myDestory" p:brand="红旗CA72" p:maxSpeed="200"/> </beans>
测试代码
public static void getBeanText() throws IOException { // 获得资源加载器的默认实现 ResourcePatternResolver res = new PathMatchingResourcePatternResolver(); Resource resource = res.getResource("classpath:com/example/beanfactory/beans.xml"); System.out.println(resource.getURL()); // 构建BeanFactory的默认实现类 DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory); reader.loadBeanDefinitions(resource); System.out.println("init BeanFactory"); //在第一次调用的时候才会初始化bean对象 Car car = factory.getBean("car", Car.class); System.out.println("car bean is ready for use!"); car.introduce(); }
XmlBeanDefinitionReader通过Resource装载Spring配置信息并启动Ioc容器,然后就可以通过BeanFactory#getBean(beanName)方法从Ioc容器中获取Bean,BeanFactory启动Ioc配置时,并不会初始化配置文件中得Bean,初始化动作发生在第一次调用。对于单实例Bean(singleton) ,BeanFactory会缓存Bean,在第二次getBean()获取Bean时,将直接从Ioc容器的缓存中获取Bean对象
Spring在DefaultSingletonBeanRegistry类中提供了一个用于缓存单实例Bean的缓存器,它是一个HashMap实现的缓存器,单实例的Bean以beanName为键保存在这个HashMap中
ApplicationContext介绍
ApplicationContext的主要实现类ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者默认从类路劲加载配置文件,后者默认从文件系统中装载配置文件
拥有的接口方法:
ApplicationEventPublisher:让容器拥有发布应用上下文的功能,包括容器启动事件和关闭事件。实现ApplicationListener事件监听器接口的Bean可以接受到容器事件,并对事件进行响应处理。在ApplicationContext抽象实现类AbstractApplicationContext中存在一个ApplicationEventMulticaster,它负责保存所有监听器,以便容器产生上下文事件时通知这些事件监听者。
MessageSource 为应用提供i18国际化访问功能
ResourcePatternResolver 所有ApplicationContext实现类都实现了类似PathMatchingResourcePatternResolver的功能,可以通过带前缀的Ant风格的资源文件路径装载Spring的配置文件
LifeCycle:该接口提供start()和stop()方法
ConfigurableApplicationContext扩展ApplicationContext,它新增两个方法:refresh()和close(),让ApplicationContext具有启动、刷新和关闭应用上下文的功能 。在应用上下文关闭的情况下调用refresh()即可启动应用上下文,在已经启动的状态下调用refresh()可清除缓存并重新装载配置信息。
//初始化上下文的时候就实例化Bean对象 ClassPathXmlApplicationContext默认在类路径下加载文件 也可以自己设定加载文件的Ant前缀 ApplicationContext context = new ClassPathXmlApplicationContext("com/example/beanfactory/beans.xml");
//初始化上下文的时候就实例化Bean对象 FileSystemXmlApplicationContext默认在文件系统路径下载配置,也可以自己设定加载文件的Ant前缀
Application context=new FileSystemXmlApplicationContext("com/example/beanfactory/beans.xml");
BeanFactory和ApplicationContext在初始化对象的时候不同,BeanFactory在初始化上下文的时候并没有实例化配置文件中的Bean,而是在第一次调用的时候才实例化。 ApplicationContext在初始化上下文的时候就实例化Bean对象
以带注解的java类提供的配置信息
//表示是一个配置信息提供类 @Configuration public class Beans { // 定义一个Bean类 @Bean(name = "car") public Car buildCar() { Car car = new Car(); car.setColor("蓝色"); car.setBrand("红旗"); car.setMaxSpeed(200); return car; } }
Spring为基于注解类的配置提供了专门的ApplicationContext实现 AnnotationConfigApplicationContext,使用此类启动Spring容器
//初始化基于注解的Bean类 public static void textAnnotation() { ApplicationContext context = new AnnotationConfigApplicationContext(Beans.class); Car car = context.getBean("car", Car.class); car.introduce(); }
Spring同样为Groovy配置类,提供专门的ApplicationContext实现 GenericGroovyApplicationContext,使用此类启动Spring容器