控制反转,通过依赖注入的方式来进行解耦,可通过设置lazy-init=“true”让它在第一次被访问时创建,。
解析xml配置文件,获取相应的bean,spring会根据对应的bean创建一个对应的bean类,里面有对应的id,type和一个map用于存储properties,一个entry对应一个properties属性,先找到对应的class文件,通过反射的方式,在实例化这个类时,通过反射调用类中的set方法,将事先保存在map中的属性注入到类中,从而获取到一个实例化好了的类,即为一个bean。
1)spring对bean进行实例化,默认bean是单例。
2)执行Bean构造器。
3)为bean注入属性。
4)调用setBeanName方法。
5)调用setBeanFactory方法。
6)若实现beanPostProcessor接口,执行postProcessBeforeInitializaiton方法。
7)若实现了initializaingBean接口,调用initializaingBean的afterPropertiesSet方法。
8)调用
9)如果bean实现了BeanPostProcessor接口,执行postProcessAfterInitializaiton方法。容器初始化成功。
10)若bean实现了DisposableBean接口,调用disposibleBean的destroy方法。
11)调用
singleton:在springIoc容器中仅存在一个Bean实例,Bean以单例方式存在,为默认值。
prototype:每次从容器中调用Bean时,返回一个新的实例。
request:每次HTTP请求都会创建一个新的bean。
session:同一个HTTP Session共享一个bean,不同session使用不同bean。
globalSession:每个全局的httpSession对应一个bean实例,仅在使用portlet context的时候有效。
基于xml的装配,基于annotation的装配和自动装配。
基于xml的装配:setter方法注入,构造方法注入。
基于annotation的装配(最常用):
component(是个泛化的概念,仅表示一个组件,可作用于任何层次)repository(标识一个数据库访问层的类为一个bean)service(作用在业务层,将业务层的一个类标识为一个bean)controller(作用在控制层,将控制层的一个类标识为一个bean)
autowired(用于对bean的属性变量,属性的set方法及构造函数进行标注,配合对应的注解处理器完成bean的自动装配工作,默认按照bean的类型进行装配)resource(类似于autowired,默认按照bean的实例名称进行装配)qualifier(于autowired配合使用,将默认的按bean类型装配修改为按bean实例名称装配,名称由qualifier注解的参数指定)
自动装配:配置
AOP的核心思想就是将应用程序中的商业逻辑同对其提供支持的通用服务进行分离,将通用服务抽象为一个切面,常用于权限验证,日志,事务处理。实现技术分为两大类,一是动态代理,利用截取消息的方式,对消息进行装饰,以取代原有对象行为的执行,二是采用静态织入的方式,引入特定的语法创建切面,使得编译器可以在编译期间织入有关方面的代码。
切面(aspect):一个关注点的模块化,这个关注点可能横切多个对象,用spring的advisor或拦截器实现。execution:用于匹配连接点的执行方法。annotation:限制匹配带有指定注释的连接点。
连接点(joinpoint):一个应用执行过程中能够插入一个切面的点,可以是调用方法时,抛出异常时等等。
切入点(pointcut):指定一个通知将被引发的一系列连接点的集合。
目标对象(target object):包含连接点的对象,也被称作被通知或被代理对象。
aop代理:aop框架创建的对象,包含通知,在spring中可以是jdk动态代理或cglib代理。
1.before:在方法调用前通知
2.after:在方法完成之后通知,无论方法执行成功与否
3.after-returning:在方法执行成功后调用通知
4.after-throwing:在方法抛出异常后通知
5.around:在被通知的方法调用之前和之后执行自定义行为
根据配置文件选择使用哪种,默认的策略是如果目标类是接口,则使用jdk动态代理,否则使用cglib。
第一步:用户发起请求到前端控制器(DispatcherServlet)
第二步:前端控制器请求处理器映射器(HandlerMappering)去查找处理器(Handle):通过xml配置或者注解进行查找
第三步:找到以后处理器映射器(HandlerMappering)向前端控制器返回执行链(HandlerExecutionChain)
第四步:前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)
第五步:处理器适配器去执行Handler
第六步:Handler执行完给处理器适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView
第八步:前端控制器请求视图解析器(ViewResolver)去进行视图解析
第九步:视图解析器像前端控制器返回View
第十步:前端控制器对视图进行渲染
第十一步:前端控制器向用户响应结果
拦截器在实现上基于反射机制,属于AOP的一种运用,一个拦截器实例在一个controller生命周期之内可以多次调用,但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理,handlerInterceptor接口定义了三个方法:
preHandle:处理请求之前调用,是链式调用,一个应用或一个请求中可同时存在多个Interceptor,会依据它的申明顺序依次执行,可以在prehandle中进行一些前置初始化操作或是对一些请求的预处理或是判断请求是否继续执行。
postHandle:请求进行处理之后执行,会在视图返回渲染之前调用,可以对要返回的modelAndView进行操作,先申明的interceptor的posthandler会后执行。
afterCompletion:在整个请求结束后,即渲染了对应的视图后执行,主要作用于资源清理工作。
依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符,进行控制权限、控制转向,过滤非法URL等等。
执行顺序:过滤前-拦截前-Action处理-拦截后-过滤后。链式拦截器和多个过滤器的执行顺序分别根据配置文件定义的顺序来决定,过滤器和拦截器都是AOP的一种实现。
Filter过滤器:拦截web访问url地址。
Interceptor拦截器:拦截以 .action结尾的url,拦截Action的访问。
Spring AOP拦截器:只能拦截Spring管理Bean的访问(业务层Service)
1. 拦截器是基于java的反射机制,使用代理模式,而过滤器是基于函数回调。 2. 拦截器不依赖servlet容器,过滤器依赖于servlet容器。 3. 拦截器只能对action起作用,而过滤器可以对几乎所有的请求起作用(可以保护资源)。 4. 拦截器可以访问action上下文,堆栈里面的对象,而过滤器不可以。 5、在action生命周期中,拦截器可以被多次调用,过滤器只能在servlet溶初始化是调用一次。6、拦截器可以获取IOC容器中的各个bean,过滤器不行,在拦截器中注入一个service可以调用逻辑业务