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;
}