2018.12.24 Spring中的aop演示(也就是运用aop技术实现代理模式)

Aop的最大意义是:在不改变原来代码的前提下,也不对源代码做任何协议接口要求。而实现了类似插件的方式,来修改源代码,给源代码插入新的执行代码。

1.spring中的aop演示

aop:面向方面编程.不改变源代码,还为类增加新的功能.(代理)  
    切面:实现的交叉功能.  
    通知:切面的实际实现(通知要做什么,怎么做).  
    连接点:应用程序执行过程期间,可以插入切面的地点.  
    切入点:真正的将通知应用到目标程序中的地点,一定是连接点.切入点是连接点的子集.  
            切入点决定了一个特定的类的特定方法是否满足一定的规则  
    引入:为类增加新的属性和方法. (引入通知)  
    目标对象:被通知的对象.  
    代理:把通知应用到目标对象以后,产生新的对象,该对象就称为代理对象.  
    织入:创建代理对象过程.  
        编译期织入:.java  --> .class,需要特殊的编译器.  
        类装载期织入:将java字节码载入到jvm时,将通知织入.需要特殊的classloader.  
        运行期(runtime):  
  
    cglib:  
  
    aop alliance:aop联盟.  
  
spring代理方案:  
    1.接口代理:jdk动态代理,创建更加松耦合的系统.  
    2.对类代理:cglib代理,final方法无法被代理.  

1.1步骤(XML配置)

1.导包(4+2+2+2+1) 基础包+日志包+aop、aspects+test+weaver+aopalliance

下面两个是spring需要的第三方aop包
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

com.springsource.org.aopalliance-1.0.0.jar

一共是11个jar包

2.准备目标对象

3.准备通知

前置通知(Before Advice):在切入点选择的连接点处的方法之前执行的通知,该通知不影响正常程序执行流程(除非该通知抛出异常,该异常将中断当前方法链的执行而返回)。 后置通知(After Advice):在切入点选择的连接点处的方法之后执行的通知,包括如下类型的后置通知: 后置返回通知(After returning Advice):在切入点选择的连接点处的方法正常执行完毕时执行的通知,必须是连接点处的方法没抛出任何异常正常返回时才调用后置通知。 后置异常通知(After throwing Advice): 在切入点选择的连接点处的方法抛出异常返回时执行的通知,必须是连接点处的方法抛出任何异常返回时才调用异常通知。 后置最终通知(After finally Advice): 在切入点选择的连接点处的方法返回时执行的通知,不管抛没抛出异常都执行,类似于Java中的finally块。 环绕通知(Around Advices):环绕着在切入点选择的连接点处的方法所执行的通知,环绕通知可以在方法调用之前和之后自定义任何行为,并且可以决定是否执行连接点处的方法、替换返回值、抛出异常等等。环绕通知还需要负责决定是继续处理join point(调用ProceedingJoinPoint的proceed方法)还是中断执行。

五种通知的执行顺序为: 前置通知→环绕通知→正常返回通知/异常返回通知→后置通知。

appilcationContext.xml中添加aop的约束文件

4.配置进行织入,将通知织入目标对象中


JoinPoint(连接点):目标对象,所有可以增强的方法。
PointCut(切入点):目标对象。已经增强的方法
Advice(通知/增强):增强的代码
Target(目标对象):被代理对象
Weaving(织入):将通知应用到切入点的过程
Proxy(代理):将通知织入到目标对象之后,形成代理对象
aspect(切面):切入点*通知

https://yq.aliyun.com/ziliao/425722

1.2 步骤(注解配置)

前面几步是一样的,

代码优化

总结

一.注解代替xml配置
准备工作:
4+2 + spring-aop包
xml中导入context约束
在xml中开启扫描包中类的注解
注解:
@Component("BeanName") 将对象注册到spring容器
|- @Controler
|- @Service
|- @Repository

	@Scope	指定对象的作用范围
		|- singleton
		|- prototype
		
	@Value 值类型属性注入
		
	@Autowired 自动属性注入.根据类型注入.
	@Qulifier 指定注入的对象的名称
	
	@Resource 指定对象的名称注入
	
	@PostConstruct 初始化方法
	@PreDestory    销毁方法

二.spring AOP开发

	aop思想: 纵向重复,横向抽取.
		|- filter中
		|- 动态代理
		|- interceptor中
		
	spring AOP: 封装了动态代理技术.来体现aop.
	
	
	springaop实现: 	可以对所有对象进行代理
			|- 动态代理	 代理需要实现接口.
			|- cglib代理 对目标对象继承代理.
	
	springaop名词:
			join point: 连接点.所有可以织入通知的方法.
			point cut : 切入点.需要|已经织入通知的方法.
			advice:		需要增强的代码.
			weaving:	动词.将通知应用的切点的过程.
			target: 目标对象.
			proxy:	代理对象
			aspect: 切面. 切入点+通知
			
	步骤:
		1.导包
			4+2
			2 aop+aspect
			2 aop联盟+weaving
		2.准备目标对象

		3.准备通知类
			 前置通知
			 后置通知 方法正常结束
			 环绕通知
			 异常拦截通知
			 后置通知 无论如何都执行
	
		4.配置文件中配置,导入aop约束
			1>目标对象
			2>通知对象
			3><aop:config>
					<aop:ponint-cut id="切点名称" expression="execution(切点表达式)" />
					<aop:aspect ref="通知对象名称" >
						<aop:before method="" ponintcut-ref=""  />
						<aop:after-returning method="" ponintcut-ref=""  />
						<aop:around method="" ponintcut-ref=""  />
						<aop:after-throwing method="" ponintcut-ref=""  />
						<aop:after method="" ponintcut-ref=""  />
					</aop:aspect>
	
	扩展:使用注解完成aop
		1.导包
			4+2
			2 aop+aspect
			2 aop联盟+weaving
		2.准备目标对象

		3.准备通知类
		4.配置文件中配置,导入aop约束
			1>目标对象
			2>通知对象
			3><aop:aspect-autoproxy> 开启注解aop
			
		5.注解
			@Aspect 指定当前类是通知类
			
			@Before 前置通知方法
			@after-returning 后置通知方法
			@around 环绕通知方法
			@after-throwing 异常拦截通知方法
			@after 后通知方法
			
			@PointCut 抽取切点表达式
原文地址:https://www.cnblogs.com/qichunlin/p/10171430.html