spring 框架 生态 spring 包含两个点 IOC: 控制反转 原来创建对象的时候需要我们自己去new 但是用spring容器帮我们创建 我们需要的时候直接去spring容器中拿 (思想) DI: 依赖注入(手段)通过DI的方式 实现把属性进行赋值的操作 AOP:
IOC 容器: 里面存放对象 Bean
过程 --->为什么写一个配置文件 我就能获取到配置文件信息 怎么设置的
1 先创建一个xml文件 <beans> 通过set get 方法赋值 <bean id=? class=? abstract init-method scope dependon .... > <property name=? value=?> <property name=? value=?> </bean> <bean id=? class=? abstract init-method scope dependon .... > 通过构造方法赋值 <constructor-arg name=? value=?> <constructorname=? value=?> </bean> </beans>
2 ApplicationContext ac=new ClassPathXmlApplicationContext("application.xml"); XXX xx=ac.getBean(xx.class); xx.method();
--------中间添加了很多功能来丰富spring框架-------------
1 加载xml
2 解析xml
3 封装BeanDefinition
4 实例化
5 放到容器中
6 从容器中获取
------
容器 存放对象 使用Map存放 我们会根据key 来查询value
因为spring 获取bean 可以根据name 也可以根据 type 因此 map的设计有两种
1 String Obj
2 class Obj
3 String ObjFactory(三级缓存(当解决循环依赖问题 一定要是有spring的三级缓存))
4 String BeanDefinition(当我们从xml中读取的一行行代码 字符串 spring需要解析这些字符串 )
----------------
ioc如何处理的?
1 因为ioc 是容器 里面有一系列bean对象 而这些bean对象是从xml文件中解析出来
而我们springboot中是yml和properties文件 这些配置文件是被 beanDefinition解析处理
因为 在xml中有很多标签 父子标签 这些标签(<>)会被解析成document对象
在配置文件 和 beanDefinition 对象之间 我们可以抽象一个接口 定义规范 方便以后的
扩展 例如:如果以后出现json格式 配置文件 通过这个接口 可以转换为beanDefinition对象
这个中间的接口 为BeanDefinitionReader
---------
spring中bean是否只单例的?
scope 默认值为singleton(单例) prototype(每次需要创建 new) request session
在beanDefintion 到 实例化对象阶段 是反射 当你使用反射时 你可以获取这个类的所有属性 方法
所有构造器 所有注解 等一系列操作
反射创建方法
Class.forName(完全限定名)
对象.getClass();
类名.class();
Constructor ctor=clazz.getConstructor();//获取构造器
Object obj=ctor.newInstance();
------------
在spring中有一个重要接口 BeanFactory 整个容器的根接口 也是容器的入口
从BeanDefintion到对象实例化过程中 有spring的很多扩展工作
1 在容器创建过程中 需要动态改变bean的信息怎么办?
<property name=url value=${jdbc.url}>
如果想随时修改beanDefiinition怎么办?
BeanFactoryPostProcessor 修改beanDefinition信息(增强) ioc
BeanPostProcessor ?修改bean信息(增强)aop
:对于属性资源配置 能够处理占位符 在beanDefinition 属性值中
可以从properties 文件中或其他文件 进行替换
当我们实现了BeanFactoryPostProcessor 我们就可以增强BeanDefiintion的信息