1.bean的作用域
2.bean的生命周期
3.aop面向切面编程
(1)概念
(2)经典应用
(3)实现原理
(4)术语
(5)手动代理
(6)半自动代理
(7)全自动代理
(8)aop通知类型
1.bean的作用域
掌握红色两个常用的即可
|
类别 |
说明 |
|
singleton |
在Spring IoC容器中仅存在一个Bean实例,Bean以单例方式存在,默认值 |
|
prototype |
每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时 ,相当于执行new XxxBean() |
|
request |
每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境 |
|
session |
同一个HTTP Session 共享一个Bean,不同Session使用不同Bean,仅适用于WebApplicationContext 环境 |
|
globalSession |
一般用于Portlet应用环境,该作用域仅适用于WebApplicationContext 环境 |
2.bean的生命周期【了解】
生命周期图
生命周期图解释
1.instantiate bean对象实例化
2.populate properties 封装属性
3.如果Bean实现BeanNameAware 执行 setBeanName
4.如果Bean实现BeanFactoryAware 执行setBeanFactory ,获取Spring容器
5.如果存在类实现 BeanPostProcessor(后处理Bean) ,执行postProcessBeforeInitialization
6.如果Bean实现InitializingBean 执行 afterPropertiesSet
7.调用<bean init-method="init"> 指定初始化方法 init
8.如果存在类实现 BeanPostProcessor(处理Bean) ,执行postProcessAfterInitialization
执行业务处理
9.如果Bean实现 DisposableBean 执行 destroy
10.调用<bean destroy-method="customerDestroy"> 指定销毁方法 customerDestroy
3.aop面向切面编程
(1)概念
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
AOP是OOP(面向对象编程)的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码
Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码
(2)经典应用
经典应用:事务管理、性能监视、安全检查、缓存 、日志等【画图】
(3)实现原理
- aop底层将采用代理机制进行实现。
- 接口 + 实现类 :spring采用 jdk 的动态代理Proxy。
- 实现类:spring 采用 cglib字节码增强。
(4)术语
1.target:目标类,需要被代理的类。例如:UserService
2.Joinpoint(连接点):所谓连接点是指那些可能被拦截到的方法。例如:所有的方法
3.PointCut 切入点:已经被增强的连接点。例如:addUser()
4.advice 通知/增强,增强代码。例如:after、before
5. Weaving(织入):是指把增强advice应用到目标对象target来创建新的代理对象proxy的过程.
6.proxy 代理类
7. Aspect(切面): 是切入点pointcut和通知advice的结合
一个线是一个特殊的面。
一个切入点和一个通知,组成成一个特殊的面。
(5)手动代理
JDK动态代理
目标类
|
|
|
切面类
工厂类
测试类
cglib 增强字节码
- 没有接口,只有实现类。
- 采用字节码增强框架 cglib,在运行时 创建目标类的子类,从而对目标类进行增强。
- 导入jar包:
自己导包(了解):
核心:hibernate-distribution-3.6.10.Final\lib\bytecode\cglib\cglib-2.2.jar
依赖:struts-2.3.15.3\apps\struts2-blank\WEB-INF\lib\asm-3.3.jar
spring-core..jar 已经整合以上两个内容
工厂类
测试结果
(6)半自动代理
目标:掌握让spring 创建代理对象,从spring容器中手动的获取代理对象。
第一步:导Jar包
【核心4+1 、AOP联盟(规范)、spring-aop (实现)】
第二步:目标类
|
|
|
第三步:切面类
第四步:spring配置
第五步:测试
(7)自动代理
目录:明白什么是全自动织入
第一步:导入jar包
spring-framework-3.0.2.RELEASE-dependencies\org.aspectj\com.springsource.org.aspectj.weaver\1.6.8.RELEASE
第二步:Spring 的AOP配置
注意:这里的切点pointcut的expression必须是用execution表达式,* com的*表示的是任意返回值,(..)表示的是任意参数的意思
下面是使用的是切面的形式
第三步:测试
(8)aop通知类型
|
AOP联盟为通知Advice定义了org.aopalliance.aop.Advice Spring按照通知Advice在目标类方法的连接点位置,可以分为5类 •前置通知 org.springframework.aop.MethodBeforeAdvice •在目标方法执行前实施增强
•后置通知 org.springframework.aop.AfterReturningAdvice •在目标方法执行后实施增强
•环绕通知 org.aopalliance.intercept.MethodInterceptor •在目标方法执行前后实施增强
•异常抛出通知 org.springframework.aop.ThrowsAdvice •在方法抛出异常后实施增强
•引介通知 org.springframework.aop.IntroductionInterceptor 在目标类中添加一些新的方法和属性 |
|
环绕通知,必须手动执行目标方法 try{ //前置通知 //执行目标方法 //后置通知 } catch(){ //抛出异常通知 } |