文章目录
spring使用过程发生了什么
在使用spring的时候我们可以写一个xml文件然后通过xml文件来获取bean
在找个过程中都发生了什么?
这两行 spring加载了xml文件 然后解析xml文件 再把它封装 实例化 然后放到容器中
这两行就比较简单了 从容器中获取对象 然后使用对象方法
容器内部应该是什么样的结构
我们获取实例是通过getbean 指定名称获取对象的
所以肯定是key-value的结构
BeanDfinition是对象定义信息
比如说这些就是它的对象定义信息
可以看到这里面有很多的get方法
Java是一门面向对象的语言 我们需要把信息给放到一个对象里面我们才能方便的得到 BeanDfinition就是来储存xml里面bean的定义信息的
IOC
ioc里面有很多的bean对象
但是我们的bean都是定义在xml里面的(也可以在properties或者yml等配置文件里面)
我们的bean信息要读取需要有一个东西去解析它 然后把它放在ioc容器里面
假如说我们用json写了配置文件 但是spring没有解析的工具我们可以实现BeanDefinitionReader这个接口去手动解析
关于BeanDefinitionReader
它有这么多的实现
如果是xml文件可以用
如果是properties可以用
它有这末多的方法
spring bean的scope属性
singleton是单例的(默认情况)
prototype是需要时创建新的
beanDefinition
获取完bean的信息之后就要实例化了
反射我们可以得到对象的所有信息(属性,注解,方法) 更加灵活
如果用new的话就非常死板了
反射如何实例化
获取class对象
然后获取构造方法
然后再newInstance()
BeanFactory
再实例化的过程中我们有可能对从beanDefinition里面读取的信息进行一个修改 比如
所以不能直接通过beanDefinition来实例化
关于PostProcessor
所谓的增强实际上就是修改
可以自己写一个处理器来修改读取的beanDefinition
下面这些都可以修改读取到的beanDefinition信息
xiu
写完之后我们就能再
这里面找到我们的实现类
定义这个bean
实例化和初始化
实例化和初始化是不同的
执行构造器是属于实例化的过程
实例化在初始化之前
初始化的执行初始化方法我们更多用的是set方法
init-method设置的是我们再执行初始化的时候要求执行的方法 比如
写一个init
再xml里面指定init方法
执行了
实例化到初始化过程
下面这两个接口都是用来修改bean信息的
拦截器和过滤器有什么区别
①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
过滤器Filter是在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完以后。
拦截器 Interceptor 是在请求进入servlet后,在进入Controller之前进行预处理的,Controller 中渲染了对应的视图之后请求结束