概述

什么是spring?
1. 框架
2. 生态
扩展性,最终达到目的:为所欲为
spring组成部分
IOC (必须搞清楚
控制反转
DI
IOC容器
过程
1. 加载xml
2. 解析xml
3. 封装BeanDefinition
4. 实例化
5. 放入容器中
6. 从容器中获取
概述
1. 存储Bean的方式:Map,相当于使用key取出value
1. key:string value:Object(by name)
2. key:Class value:Object(by type)
3. key:string value:ObjectFactory(静态工厂/对象工厂)
4. key:string value:BeanDefinition
BeanDefinition:Bean定义信息,存放一个对象创建的所有信息。 xml、properties、yaml、注解-> BeanDefinition。 需要一个抽象层提供统一的解析处理 (定义规范,方便扩展 BeanDefinitionReader)
2. BeanDefinitionReader:
1. 统一的解析处理
2. XmlBeanDefinitionReader、PropertiesBeanDefinitionReader、GroovyBeanDefinitionReader
3. 实例化
1. 构建方式:反射
好处:可以获得当前类中的所有注解、属性、方法、构造器
2. scope有singleton、protocol、request、session,默认使用singleton
1. 获取Class
1. 获取Class Class.forName("完全限定名")
2. Object.getClass()
3. 类名.class()
2. Object obj = Clazz.getConstructor().getInstance()
4. BeanFactory
1. Bean工厂、整个容器的根接口、整个容器的入口
2. 详见BeanFactory
5. aware接口到底是什么?
1. 标记超级接口,指示Spring容器可以通过回调样式方法将bean通知给特定的框架对象。 实际的方法签名是由各个子接口确定的,但通常应仅由一个接受单个参数的void返回方法组成
2. 由invokeAwareMethods进行属性值的设置
3. 用途:当Spring容器创建当Bean对象在进行具体操作时,如果需要容器的其他对象,此时可以将对象实现Aware接口,来满足当前的需要
/**
* 对Aware类型进行判断,然后依次设定属性值
* @param beanName bean名称
* @param bean bean
*/
private void invokeAwareMethods(String beanName, Object bean) {
        if (bean instanceof Aware) {
                if (bean instanceof BeanNameAware) {
                        ((BeanNameAware) bean).setBeanName(beanName);
                }
                if (bean instanceof BeanClassLoaderAware) {
                        ClassLoader bcl = getBeanClassLoader();
                        if (bcl != null) {
                                ((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
                        }
                }
                if (bean instanceof BeanFactoryAware) {
                        ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
                }
        }
}
6. 创建对象的过程
1. 实例化
2. 在堆中开辟一块空间
3. 对象的属性都是默认值
4. 初始化
5. 给属性设置值
6. 填充属性
7. [可选]设置Aware接口、Environment接口
8. BeanPostProcessor.before(aop[AbstractAutoProxyCreator]继承了这个类)
9. 执行初始化方法init-method
10. BeanPostProcessor.after
11. 完整对象创建完成,context.getBean()可以获取
7. SpringBean
1. 分类
1. 普通对象(我们自定义的需要的对象)
1. 容器对象(容器内置的对象,Spring需要的对象 见refreshBeanFactory[创建工厂]、invokeBeanFactoryPostProcessors[aop容器也在这里创建的])
@Override
protected final void refreshBeanFactory() throws BeansException {
        if (hasBeanFactory()) {
                destroyBeans();
                        closeBeanFactory();
        }
        try {
                //AbstractRefreshableApplicationContent#createBeanFactory()创建DefaultListableBeanFactory对象工厂
                DefaultListableBeanFactory beanFactory = createBeanFactory();
                //对BeanFactory设置序列化id
                beanFactory.setSerializationId(getId());
                //定制化BeanFactory,例如lookup-method、replace-method、是否允许被重写等
                customizeBeanFactory(beanFactory);
                //加载BeanDefinitions
                loadBeanDefinitions(beanFactory);
                //构建完成
                this.beanFactory = beanFactory;
        }
        catch (IOException ex) {
                throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
        }
}
/**
* 将所有BeanFactoryPostProcessor实例化
* Instantiate and invoke all registered BeanFactoryPostProcessor beans,
* respecting explicit order if given.
*

Must be called before singleton instantiation.
*/
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
        PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());

        // Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
        // (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
        if (!NativeDetector.inNativeImage() && beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
                beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
                beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
        }
}

8. 在不同的阶段要处理不同的工作,应该怎么办? 观察者模式:监听器、监听事件、多播器(广播器)
在程序运行过程中,我们该如何改变bean的信息?
1. BeanFactoryPostProcessor 后置处理增强器-增强BeanDefinition信息
区别于BeanPostProcessor:增强bean信息
eg. PlaceHolderConfigurerSupport : spEl表达式的解析
一些重要接口
1. BeanFactory(必须遵循完整的创建流程,由spring管控)
2. Aware
3. BeanDefinition
4. BeanDefinitionReader
5. BeanFactoryPostProcessor
6. BeanPostProcessor
7. Environment
1. StandardEnvironment 存放系统中的某些值、环境变量值
1. 当完成整个容器的创建时,就会将系统中的某些值、环境变量值放入容器之中
2. System.getEnv()
3. System.getProperties()
8. BeanDefinitionRegistry(对定义的Bean信息进行CRUD操作)
9. FactoryBean(使用getObject()就可以返回具体对象,整个对象的创建过程由用户自己控制,更加灵活)
getObject()
isSingleTon()
getObjectType()
spring先去容器中获取,若获取不到,则调用getObject()去获取,这个不会走spring正常生命周期
aop
返回首页