Spring核心知识点
2023-02-21 21:02:13 0 举报
AI智能生成
Spring核心知识点
作者其他创作
大纲/内容
基本概念
Bean
被Spring管理的对象叫做Bean
Bean肯定是一个对象,对象不一定是Bean
BeanDefinition
BeanDefinition是用来描述一个Bean的,表示Bean的定义
beanClass
Bean对象的类型
scope
singleton
在Spring容器中,一个beanName只对应一个Bean对象
prototype
在Spring容器中,每次通过beanName获取的都是新的Bean对象
request
一个请求中,一个beanName只对应一个Bean对象
session
一个Session中,一个beanName只对应一个Bean对象
application
一个应用中,一个beanName只对应一个Bean对象
自定义作用域
可以自定义作用域
isLazy
@Lazy
是不是一个懒加载的Bean
原型懒加载Bean
没有意义
单例懒加载Bean
非懒加载的单例Bean是在Spring启动的时候创建的
懒加载的单例Bean不是在Spring启动的时候创建的,而是在第一次获取Bean时创建的
dependsOn
@DependsOn
表示所依赖的其他Bean
autowire
自动装配模式
<bean id="x'x'x" class="x'x'x" autowire="byType" />
constructor
通过类中的构造方法进行自动装配
涉及到构造方法推断
byType
通过类中的set方法的参数类型进行自动装配
byName
通过类中的set方法的名字进行自动装配
no
默认值,不进行自动装配
注意和@Autowired的区别
autowireCandidate
<bean id="xxx" class="xxx" autowire-candidate="false"/>
当前Bean是不是一个自动装配候选者
表示当前Bean能不能自动注入给其他Bean,默认为true,如果为false,表示当前这个Bean不能自动注入给其他Bean
primary
@Primary
主Bean
在进行自动注入时,通过属性类型,或方法参数类型可能会找到多个Bean,如果这多个Bean中存在一个主Bean,那么就直接把这个主Bean注入给属性或方法,如果存在多个主Bean,则会报错
initMethodName
初始化方法
Spring在创建Bean的过程中会调用初始化方法
destroyMethodName
销毁方法
Spring在销毁Bean的过程中会调用销毁方法
constructorArgumentValues
<span><font color="#222222">构造方法参数值</font></span>
<span><font color="#222222">可以通过BeanDefinition中的这个属性来给构造方法传递值</font></span>
propertyValues
<span><font color="#222222">属性值</font></span>
<span><font color="#222222">可以通过BeanDefinition中的这个属性来给属性赋值</font></span>
<span><font color="#222222">factoryBeanName</font></span>
<span><font color="#222222">一个Bean,可以通过另外一个Bean的某个方法来创建,这个属性就是指向另外那个Bean的beanName</font></span>
<span><font color="#222222">factoryMethodName</font></span>
<span><font color="#222222">一个Bean,可以通过另外一个Bean的某个方法来创建,这个属性就是另外那个Bean中的某个方法名字</font></span>
<span><font color="#222222">BeanFactory</font></span>
<span><font color="#222222">Bean工厂,可以根据某个bean的名字、或类型、或别名获取某个Bean对象</font></span>
<span><font color="#222222">BeanDefinitionRegistry</font></span>
<span><font color="#222222">可以注册、保存、移除、获取某个BeanDefinition</font></span>
<span><font color="#222222">SingletonBeanRegistry</font></span>
<span><font color="#222222">可以直接注册、获取某个单例Bean</font></span>
<span><font color="#222222">ListableBeanFactory</font></span>
<span><font color="#222222">在BeanFactory的基础上,增加了其他功能,可以获取所有BeanDefinition的beanNames,可以根据某个类型获取对应的beanNames,可以根据某个类型获取{类型:对应的Bean}的映射关系</font></span>
<span><font color="#222222">HierarchicalBeanFactory</font></span>
<span><font color="#222222">在BeanFactory的基础上,添加了获取父BeanFactory的功能</font></span>
<span><font color="#222222">ConfigurableBeanFactory</font></span>
<span><font color="#222222">在HierarchicalBeanFactory和SingletonBeanRegistry的基础上,添加了设置父BeanFactory、类加载器(表示可以指定某个类加载器进行类的加载)、设置Spring EL表达式解析器(表示该BeanFactory可以解析EL表达式)、设置类型转化服务(表示该BeanFactory可以进行类型转化)、可以添加BeanPostProcessor(表示该BeanFactory支持Bean的后置处理器),可以合并BeanDefinition,可以销毁某个Bean等等功能</font></span>
<span><font color="#222222">AutowireCapableBeanFactory</font></span>
<span><font color="#222222">是直接继承了BeanFactory,在BeanFactory的基础上,支持在创建Bean的过程中能对Bean进行自动装配</font></span>
<span><font color="#222222">AbstractBeanFactory</font></span>
<span><font color="#222222">实现了ConfigurableBeanFactory接口,继承了FactoryBeanRegistrySupport,这个BeanFactory的功能已经很全面了,但是不能自动装配和获取beanNames</font></span>
<span><font color="#222222">ConfigurableListableBeanFactory</font></span>
<span><font color="#222222">继承了ListableBeanFactory、AutowireCapableBeanFactory、ConfigurableBeanFactory</font></span>
<span><font color="#222222">AbstractAutowireCapableBeanFactory</font></span>
<span><font color="#222222">继承了AbstractBeanFactory,实现了AutowireCapableBeanFactory,拥有了自动装配的功能</font></span>
<span><font color="#222222">DefaultListableBeanFactory</font></span>
<span><font color="#222222">继承了AbstractAutowireCapableBeanFactory,实现了ConfigurableListableBeanFactory接口和BeanDefinitionRegistry接口,所以DefaultListableBeanFactory的功能很强大</font></span>
<span><font color="#222222">ApplicationContext</font></span>
<span><font color="#222222">ApplicationContext是个接口,可以把它理解为一个特殊的BeanFactory</font></span>
继承
<span><font color="#222222">HierarchicalBeanFactory</font></span>
<span><font color="#222222">拥有获取父BeanFactory的功能</font></span>
<span><font color="#222222">ListableBeanFactory</font></span>
<span><font color="#222222">拥有获取beanNames的功能</font></span>
<span><font color="#222222">ResourcePatternResolver</font></span>
<span><font color="#222222">资源加载器,可以一次性获取多个资源(文件资源等等)</font></span>
<span><font color="#222222">EnvironmentCapable</font></span>
<span><font color="#222222">可以获取运行时环境(没有设置运行时环境功能)</font></span>
<span><font color="#222222">ApplicationEventPublisher</font></span>
<span><font color="#222222">拥有广播事件的功能(没有添加事件监听器的功能)</font></span>
<span><font color="#222222">MessageSource</font></span>
<span><font color="#222222">拥有国际化功能</font></span>
实现类
<span><font color="#222222">AnnotationConfigApplicationContext</font></span>
<span><font color="#222222">ConfigurableApplicationContext</font></span>
<span><font color="#222222">继承了ApplicationContext接口,增加了,添加事件监听器、添加BeanFactoryPostProcessor、设置Environment,获取ConfigurableListableBeanFactory等功能</font></span>
<span><font color="#222222">AbstractApplicationContext</font></span>
<span><font color="#222222">实现了ConfigurableApplicationContext接口</font></span>
<span><font color="#222222">GenericApplicationContext</font></span>
<span><font color="#222222">AnnotationConfigRegistry</font></span>
<span><font color="#222222">可以单独注册某个为类为BeanDefinition(可以处理该类上的@Configuration注解,已经可以处理@Bean注解),同时可以扫描</font></span>
<span><font color="#222222">AnnotationConfigApplicationContext</font></span>
<span><font color="#222222">继承了GenericApplicationContext,实现了AnnotationConfigRegistry接口,拥有了以上所有的功能</font></span>
<span><font color="#222222">ClassPathXmlApplicationContext</font></span>
<span><font color="#222222">它也是继承了AbstractApplicationContext,但是相对于AnnotationConfigApplicationContext而言,功能没有AnnotationConfigApplicationContext强大,比如不能注册BeanDefinition</font></span>
BeanPostProcessor
<span><font color="#222222">Bean的后置处理器</font></span>
<span><font color="#222222">Spring中提供的扩展机制,允许程序员可以干涉Bean的生命周期</font></span>
<span><font color="#222222">子接口</font></span>
<span><font color="#222222">InstantiationAwareBeanPostProcessor</font></span>
<span><font color="#222222">在BeanPostProcessor的基础上增加了实例化前</font></span>
<span><font color="#222222">在BeanPostProcessor的基础上增加了实例化后</font></span>
<span><font color="#222222">在BeanPostProcessor的基础上增加了填充属性</font></span>
<span><font color="#222222">DestructionAwareBeanPostProcessor</font></span>
<span><font color="#222222">在BeanPostProcessor的基础上增加了销毁前</font></span>
<span><font color="#222222">MergedBeanDefinitionPostProcessor</font></span>
<span><font color="#222222">在BeanPostProcessor的基础上增加了实例化和实例化后之间</font></span>
<span><font color="#222222">SmartInstantiationAwareBeanPostProcessor</font></span>
<span><font color="#222222">在InstantiationAwareBeanPostProcessor的基础上增加了推断构造方法</font></span>
<span><font color="#222222">在InstantiationAwareBeanPostProcessor的基础上增加了提前暴露引用</font></span>
BeanFactoryPostProcessor
<span><font color="#222222">Bean工厂的后置处理器</font></span>
<span><font color="#222222">Spring中提供的扩展机制,允许程序员可以操作BeanFactory</font></span>
<span><font color="#222222">可以获取到BeanFactory,程序员可以操作BeanFactory</font></span>
<span><font color="#222222">注意,不能注册BeanDefinition,只能修改BeanDefinition</font></span>
<span><font color="#222222">子接口</font></span>BeanDefinitionRegistryPostProcessor
可以注册BeanDefinition<br>
Bean
<span><font color="#222222">Bean的生命周期</font></span>
1. 生成BeanDefinition<br>
<span><font color="#222222">2. 合并BeanDefinition</font></span>
<span><font color="#222222">3. 加载类</font></span>
<span><font color="#222222">4. 实例化前</font></span>
<span><font color="#222222">5. 推断构造方法</font></span>
<span><font color="#222222">6. 实例化</font></span>
<span><font color="#222222">7. BeanDefinition的后置处理</font></span>
<span><font color="#222222">8. 填充属性</font></span>
<span><font color="#222222">9. 执行Aware</font></span>
<span><font color="#222222">BeanNameAware</font></span>
<span><font color="#222222">BeanClassLoaderAware</font></span>
<span><font color="#222222">BeanFactoryAware</font></span>
<span><font color="#222222">10. 初始化前</font></span>
<span><font color="#222222">ApplicationContextAwareProcessor主要也是执行一些其他的Aware</font></span>
<span><font color="#222222">EnvironmentAware</font></span>
<span><font color="#222222">EmbeddedValueResolverAware</font></span>
<span><font color="#222222">ResourceLoaderAware</font></span>
<span><font color="#222222">ApplicationEventPublisherAware</font></span>
<span><font color="#222222">MessageSourceAware</font></span>
<span><font color="#222222">ApplicationContextAware</font></span>
<span><font color="#222222">InitDestroyAnnotationBeanPostProcessor</font></span>
<span><font color="#222222">执行@PostConstruct定义的方法</font></span>
<span><font color="#222222">11. 初始化</font></span>
<span><font color="#222222">执行InitializingBean接口中的方法</font></span>
<span><font color="#222222">执行BeanDefinition中所定义的初始化方法</font></span>
<span><font color="#222222">12. 初始化后</font></span>
AbstractAutoProxyCreator<br>
<span><font color="#222222">AOP功能实现者</font></span>
<span><font color="#222222">Bean销毁的生命周期</font></span>
<span><font color="#222222">1. 容器关闭</font></span>
<span><font color="#222222">2. 发布ContextClosedEvent事件</font></span>
<span><font color="#222222">3. 调用LifecycleProcessor的onClose方法</font></span>
<span><font color="#222222">4. 销毁单例Bean</font></span>
<span><font color="#222222">1. 找出所有DisposableBean(实现了DisposableBean接口的Bean)</font></span>
<span><font color="#222222">2. 遍历每个DisposableBean</font></span>
<span><font color="#222222">3. 找出依赖了当前DisposableBean的其他Bean,将这些Bean从单例池中移除掉</font></span>
<span><font color="#222222">4. 调用DisposableBean的destroy()方法</font></span>
<span><font color="#222222">5. 找到当前DisposableBean所包含的inner beans,将这些Bean从单例池中移除掉</font></span>
<span><font color="#222222">扩展点</font></span>
<span><font color="#222222">@Import</font></span>
<span><font color="#222222">普通类</font></span>
<span><font color="#222222">可以将指定的多类注册为BeanDefinition</font></span>
<span><font color="#222222">ImportSelect</font></span>
<span><font color="#222222">可以将指定的多类注册为BeanDefinition</font></span>
<span><font color="#222222">ImportBeanDefinitionRegistrar</font></span>
<span><font color="#222222">可以注册BeanDefinition</font></span>
<span><font color="#222222">BeanFactoryPostProcessor</font></span>
<span><font color="#222222">针对BeanFactory的扩展点,可以操作BeanFactory</font></span>
<span><font color="#222222">BeanDefinitionRegistryPostProcessor</font></span>
<span><font color="#222222">针对BeanDefinitionRegistry的扩展点,可以注册BeanDefinition</font></span>
0 条评论
下一页