Spring中的AOP
AOP:aspect origin program 面向切面编程
Spring为什么要AOP?
N个业务组件,每个组件有M个方法,一共有N*M个方法
若需要为每一个方法都增加一个“通用功能”,例如:事物处理,日志,权限控制...
AOP(aspect orient program):在保证程序员不修改方法A,方法B,方法C。。。的前提下,可以为
方法A,方法B,方法C。。。增加通用方法处理。
本质:依然在去修改方法A,方法B,方法c--只是这个修改由AOP框架完成。
Spring AOP的配置
1.指定的目标方法哪里插入(after,before,around)
2.通过execution表达式指定哪些方法执行插入
3.指定插入怎样的一段代码
根据以上这三部,来如何简单使用AOP。
例如在
com.feng.test 包下邮如下两个类:
- package com.feng.test;
- public class Method1 {
- public void fun1() {
- System.out.println("Method1" + "1111111111111111");
- }
- public void fun11() {
- System.out.println("Method11111111" + "1111111111111111");
- }
- }
复制代码- package com.feng.test;
- public class Method2 {
- public void fun2() {
- System.out.println("method2" + "22222222222222");
- }
- }
复制代码
如果在不修改源码的基础上,为这两个类增加一个方法,该如何做到了?
beans.xml配置如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans
- xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
-
-
- <bean id="me1" class="com.feng.test.Method1" />
- <bean id="me2" class="com.feng.test.Method2" />
-
- <!-- 定义切面类 -->
- <bean id="aspect_autho" class="com.feng.aspect.Autho" />
- <aop:config>
- <!-- aspect把普通的类转换为 切面 -->
- <aop:aspect ref="aspect_autho">
- <!-- 有before after等 -->
- <!-- 包名下的所有类所有方法参数不限 -->
- <!-- method表示切面的方法 -->
- <aop:before method="fun"
- pointcut="execution(* com.feng.test.*.*(..))"/>
- </aop:aspect>
- </aop:config>
- </beans>
复制代码
这个过程就交给Spring完成了。aop配置的意思就是在com.feng.test下的所有类,所有方法,参数不限下,为每个方法前增加了一个fun方法(fun方法是增加增加的一个通用类中的方法)。
测试如下:
- package com.feng.test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class Test {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- /* Method1 m1 = new Method1();
- Method2 m2 = new Method2();
-
- m1.fun1();
- m2.fun2();*/
-
- ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
-
- System.out.println(ctx);
- Method1 m1 = (Method1) ctx.getBean("me1");
- Method2 m2 = (Method2) ctx.getBean("me2");
-
-
- m1.fun1();
- m1.fun11();
-
- System.out.println("----------------------");
- m2.fun2();
- }
- }
复制代码
切面类如下:
- package com.feng.aspect;
- public class Autho {
- public void fun() {
- System.out.println("正在模拟 AOP");
- }
- }
复制代码
显示结果如下:
正在模拟 AOP
Method11111111111111111
正在模拟 AOP
Method111111111111111111111111
----------------------
正在模拟 AOP
method222222222222222
更多细节 自己还不是很懂!!! 只是学的学的东西很多,用到的时候就深究吧!
|
|