转载

Spring

核心容器

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)
            
        }
    }
原文  https://segmentfault.com/a/1190000021096955
正文到此结束
Loading...