JavaSpring AOP小结

AOP原理 小翼版

首先导入这些jar包放在WEB-INF 下的lib中
在这里插入图片描述
AOP–英文全称为(Aspect Oriented Programming) 面向切面编程
aop面向切面变成对于我的理解来说,aop本身这个词很抽象,我看了半天也是没看懂,也是要借助许多网上的素材才得以了解的,我总之就是几句话把它给具象化秒速一番。

假如,一个人,他叫小明,他喜欢去吃饭,吃饭就可以当做一个切入点(pointcut),我们可以把自己想象成他去吃饭,这样的话,吃一顿饭可以扩展出不同的吃法,比如用筷子吃法,用勺子吃饭,用手抓饭,甚至可以用嘴巴像狗一样直接伸到碗里面啃(当然哈,这是开玩笑)。不管你小明是怎么吃这顿饭的,吃饭的本身就是切入点,不能改变的事实,但是吃饭就可以有很多种方式,你的餐具,你吃多少,这都是根据不同人的喜好和习惯所决定的,这就是所谓的业务拓展性。

在代码里面也是如此
加入你有一个乘法的算法,你把它写成了一个calculate类里面的一个方法multiply(int a,intb),往里面传入任意的整数型参数,创建calculate对象调用该方法,都无法在改变他源码的事实上改变他是个乘法运算的方法。但是,我们可以加强这个方法,这个就是(aspect)切面加强,此时,我们只能在不改变它是乘法运算的本身拓展出他的业务,最常见的就是加入日志等业务,我们可以用 aop的原理,是在multiply这个方法调用前和调用后做一些你想做的事情,使得的歌功能变得强大起来,这个就是aop本身的原理。

图画表示

在这里插入图片描述
下面就是一个简单的配置
首先们得要在src目录下创建一个bean的容器,来分装这些配置
配置内容:

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
	
	<!-- AspectJ之XML文件方式实现AOP -->
 	<bean id="calculateImpl" class="com.xxx.aspectj.xml.CalculateImpl"></bean>
 	<bean id="aspects" class="com.xxx.aspectj.xml.MyAspect" />
 	
 	<!-- 配置切面 -->
 	<aop:config>
 	 	<!-- 配置切入点 -->
 	<aop:pointcut expression="execution(* com.xxx.aspectj.xml.CalculateImpl.add(..)) " id="pointcut"/>
 	
 		<aop:aspect id="aspect" ref="aspects">
 			<!-- 配置切点表达式,语法:
 				execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern) throws-pattern?)
 				问号表示当前项可以有也可以没有,其中各项的语义如下:
				modifiers-pattern:方法的可见性,如public,protected;
				ret-type-pattern:方法的返回值类型,如int,void等;
				declaring-type-pattern:方法所在类的全路径名,如com.spring.Aspect;
				name-pattern:方法名类型,如buisinessService();
				param-pattern:方法的参数类型,如java.lang.String;
				throws-pattern:方法抛出的异常类型,如java.lang.Exception;
 			
 			
 			 -->
 			<!-- <aop:around method="five" pointcut-ref="pointcut" />  -->
 			<!-- <aop:after-returning method="two"  pointcut-ref="pointcut"  returning="re"/>
 			<aop:before method="one" pointcut-ref="pointcut" />
 			<aop:after-throwing method="three" pointcut-ref="pointcut"  throwing="ex"/>-->
 			<aop:after method="four" pointcut-ref="pointcut"  /> 
 			<aop:around method="five" pointcut-ref="pointcut" /> 
 			
 	   </aop:aspect>
 	</aop:config>
</beans>

里面的包裹大概是这样的

<beans xml="....................约束内容">
	<aop:config>
		<aop:aspect>
			<aop:before/>
		<aop:aspect>
	<aop:config>
</beans>

这样子是最基本的包裹形式。

aop的使用方式还有标签的方法:
配置为文件

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">

	<!-- AspectJ之注解方式实现AOP -->
 	<!-- spring不自动寻找带注解的类,需要告诉哪些包中存在带注解的类 -->
 	<context:component-scan base-package="com.xxx.aspectj.annotation"></context:component-scan>
 	<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>

在增强类中,标签的配置基本上为
pointcut的配置在这里插入图片描述
aop:before的配置
在这里插入图片描述
在这里插入图片描述
aop:after的配置
在这里插入图片描述
aop:around 环绕配置:这个我不知道如何解释为好,就相当于before和after的综合使用
在这里插入图片描述
aop:after-returingd的配置在这里插入图片描述
aop:after-throwing错误抛出的配置
在这里插入图片描述
再说一下环绕配置,around这个功能呢,其实就是所有东西的集合,代码来表示更加简明一些

public Object five(ProceedingJoinPoint pjp){
		Object[] args = pjp.getArgs();
		String name = pjp.getSignature().getName();
		System.out.println(name+"环绕前置就绪,参数列表是:"+Arrays.asList(args));
		Object result=null;
		try {
			result = pjp.proceed();
			System.out.println(name+"的环绕返回结果是:"+result);
		} catch (Throwable e) {
			
			e.printStackTrace();
			System.out.println("异常通知执行");
		}finally{
			System.out.println(name+"环绕后置执行完毕,参数列表是:"+Arrays.asList(args));
		}
		
		
		return result;
		
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值