使用Spring生态三四年了,从来只是使用,也没看过里面的内容。今日开始走进Spring。
一、Spring是什么?
Spring是框架,是生态,提供了一系列衍生的产品。扩展性高。
Spring包括两部分:IOC 和 AOP
IOC:控制反转(对象交给Spring控制,需要的时候通过容器注入 )【是一种思想】
--------IOC是容器,可以存放Bean
DI:依赖注入(把属性进行注入操作)【是一种属性】
二、bean的前世今生
在Spring中,bean是写在xml文件中的。
通过ApplicationContext获取
bean的初始过程
加载xml文件,解析xml内容,创建初始bean(就是执行构造方法),实例化bean,把bean放到容器中,使用时从容器中获取bean。
容器使用map存bean,正常情况下 key为String类型,value为Object类型。所以我们才可以通过class名来取bean。
此外,还通过三级缓存来解决循环依赖,这里还是用 key为String类型,但value是使用 ObjectFactory类型。
当然,读取出来是String类型,再转成对象,需要BeanDefinition(对象定义信息)
Spring中的bean默认单例
scope:作用域
singleton:单例
prototype:每次用的时候创建新的
为什么 beanDefinition创建bean的实例时,用的是反射而不是new?
使用反射可以获取当前类的所有属性、方法、注解、构造器等。
而使用new则过于死板。不够灵活。
三种得到Class的方式:
Class.forName(包名.类名)
对象.getClass()
类名.class()
得到Class对象后,获取对应的构造方法
Constructor stor=clazz.getConstructor();
stor.newInstance();
实例化是给对象在堆里开辟空间,赋的值都是默认值。而初始化是给属性赋值,填充属性,是执行初始化方法。
这个是自动代理创建器抽象类,继承了ProxyProcessorSupport类,重写 before 和 after ,即
会创建代理
往里面跟进
就是常用的JDK代理和CGlib代理
Aware接口的作用:当Spring容器创建的Bean对象在进行具体操作时,如果需要容器的其他对象,此时可以将对象实现Aware接口来满足当前需求。
SpringBean分两种,普通对象和容器对象。普通对象是我们自定义的对象,如xml中的,而容器对象是容器创建运行自身需要的对象。
如: