核心容器
Spring 轻量级企业开发框架, 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)
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。