Spring 轻量级企业开发框架, Spring 是分层框架,分模块框架,每个模块都能单独使用。
BeanFactory 和 Application 的作用
BeanFactory 是基础容器的顶级接口。
通过该容器加载bean的时机是第一次调用getBean方法的时候。
ApplicationContext 是BeanFactory接口的子接口。此为Spring的高级容器。
IOC容器,基础容器BeanFactory 和高级容器ApplicationContext
IOC 控制反转。
创建bean实例的权利交给Spring 容器去处理。
DI 依赖注入,基于IOC,动态的给Spring 容器中的Bean进行依赖注入。
AOP 面向切面编程。
BeanFactory 和 FactoryBean
BeanFactory Spring 基础容器,里面储存了Spring 所有单利bean
FactoryBean Spring 的一个bean,bean会放入BeanFactory进行管理,
BeanFactoryPostProcessor 和 BeanPostProcessor 区别
BeanFactoryPostProcessor 可以针对BeanDefineition 对象进行后置处理。
Spring 中的BeanFactory (基础容器) 使用简单工厂模式实现的,
public class AnimalFactory { private Map<String, Object> sinletonObjects = new HashMap<>() // 简单工厂设计模式 public static Animal createAnimal(String name){ if("cat".equals(name)){ return new Cat(); }else if("dog".equals(name)){ return new Dog(); }else{ return null; } } }
XmlBeanFactory 初始流程如下
XmlBeanFactory的初始化流程思路分析:
通过xml配置文件来配置bean的信息(可以动态修改) <beans> <bean name="userService" class="xxx.UserService"> <property name="dao" ref="userDao"> <constructor-arg> </bean> <bean name="userDao" class="xxx.UserDao"> <property> <constructor-arg> </bean> </beans> 需要去加载xml配置文件,并且进行解析-----类似于mybatis的配置文件的解析 定位资源 加载资源 解析并注册BeanDefinition bean标签封装成BeanDefinition对象 property标签封装成PropertyValue对象 String name Object value;----value属性(TypedStringValue)、ref属性(RuntimeBeanReference) <constructor-arg>标签封装成ConstructorValue对象 public class BeanFactory { // 存储beanname和单例的bean实例之间的映射关系 private Map<String,Object> sinletonObjects = new HashMap<>(); // 存储的beanname和BeanDefinition对象的映射关系,该集合的数据是由配置文件加载和解析而来 private Map<String,BeanDefinition> beanDefinitionMap = new HashMap<>(); // 简单工厂设计模式(负担太重、不符合开闭原则) public Object getBean(String beanName) { Object bean = sinletonObjects.get(beanName); if(bean != null ) return bean; //创建bean对象,然后放入map // 将要创建的bean的信息通过配置文件(xml)来配置 // 读取配置文件中的bean信息,然后去创建bean对象 查找beanDefinitionMap集合,获取知道beanname的BeanDefinition对象 通过BeanDefinition对象的bean的信息去创建bean实例 1.实例化---获取class信息,然后通过反射去创建该对象 2.设置属性--获取该bean的PropertyValue集合,去遍历该集合,获取PropertyValue对象中的name和value 需要对value进行处理(需要将字符串值的value,转成指定类型的value) 通过反射去设置value值。 3.初始化---获取bean标签的init-method属性,然后去通过反射,调用实例化对象的指定方法 sinletonObjects.put(beanname,beanInstance) } }