spring 大体流程
spring的核心是ioc 所有的操作都是基于ioc来完成的 ioc是一个容器 为了解决类跟类之间的耦合问题 就是说 有一个A类 有一个B类
public class A{
B b = new B();
}
public class B{
A a = new A();
}
上面的代码 我们自己手动new的对象 这样耦合度就会很高 比如 后期想把A类里面的B b = new B() 改成C c = new C() 这样就会改跟多的地方 如果使用接口开发模式 会解决上面的问题 但是我们还是需要手动的更改实现类还是有耦合问题 ioc就为了解决这个问题 我们现在是手动的new对象 而ioc的思想是 把对象放到一个集合中 当我们需要这个对象时 从集合中拿 这样我们只需要更改集合中的实现类即可 代码一点都不需要改 spring就实现了这个东西
使用spring时只需要写bean spring就会把bean放到集合中 用的时候根据名字(默认类名)就可以得到实例 不需要我们手动new 它的大体流程
spring有javaConfig跟xml方式
ClassPathXmlApplicationContext xml方式
AnnotationConfigApplicationContext(读音 昂脑tei神 抗飞个 a破落kei神 抗太死特) javaConfig
以javaConfig方法写
在main方法中我们只需要创建一个AnnotationConfigApplicationContext这个对象 给它传一个配置类 它就可以自己找标记为Bean的类 然后放到ioc中 有三个步骤 首先是读取配置类 比如要扫描哪个包下的类 然后是扫描标记为bean的类 然后把类注册成一个bean定义(就是把类封装成BeanDefinition类型bean定义是它的中文意思 读音 宾的飞内神)让后放到一个map集合中 在中期间会调用两个后置处理器类 就是可以让我干扰注册bean定义的类
关键的类
BeanDefinitionReader (读音 宾 的飞内神 瑞的 中文意思 bean定义读取) 读取配置类
BeanDefinitionSacnner(读音 宾 的飞内神 斯敢那 中文意思 bean定义扫描) 扫描
BeanDefinitionRegistry(读音 宾 的飞内神 ruai着4️ 追 中文意思 bean定义注册) 注册成 BeanDefinition类型(bean定义是它的中文意思 读音 宾 的飞内神)
后置处理器
BeanFactoryPostProcessor(读音 宾 抗飞个 跑四特 破色c 中文意思 PostProcessor后处理器 也就是bean工厂的后处理器) 实现它的方法 它会给返回一个BeanFactory 然后使用BeanFactory的注册BeanDefinition方法api修改bean 所以它修改bean定义的 修改就是在原有的bean定义基础上修改成别的类型
BeanDefinitionRegistryPostProcessor(读音 宾 的飞内神 中文意思bean定义注册的后处理器) 从中文意思就可以看出 是用来添加bean定义的
bean创建完 接下来 BeanFactory就会扫描存放bean定义的集合 把bean一个一个的拿出来进行实例化 在bean定义的类中有属性存放类的class 后面写源码会写出来
然后就是bean的生命周期
实例化 --》填充属性 --》初始化 --》放到一级缓存
实例化就是通过反射创建对象 执行实例化的后处理器
填充属性就是 把加了@Value或@Autowired注解的属性赋值 解决循环依赖 执行填充属性的后处理器
初始化就是调用initMethod destroy 还有一大堆的Aware中的方法 还有aop的实现 在这里实现aop可以跟bean的生命周期解耦 执行初始化的后处理器
ioc的过程用人话就是
你去洗浴中心洗澡 首先会有前台 也就是AnnotationConfigApplicationContext 接应你 你告诉它要什么什么服务 比如要特殊服务 然后它通知服务员 服务员通知小姐姐 去找你然后被服务上了 也就是AnnotationConfigApplicationContext通知BeanFactory创建什么那些bean 然后你调用getBean的时候给你bean
BeanFactory跟ApplicationContext它们两个都可以创建bean 而ApplicationContext会给我们实现一些额外的功能
BeanFactory就相当于正规的洗浴中心 就是洗澡按摩 在spring中BeanFactory就只能创建bean获取bean 其它的都不能做 如果在内存比较小的机器上可以使用BeanFactory进行开发
ApplicationContext就是一个不正规的洗浴中心 不但能洗澡按摩 还有特殊服务 比如提供小日本拍的技术教学电影中的内容 在Spring中ApplicationContext给我提供的自动扫描、自动把标记为bean的java类封装成bean定义等