spring aop中有些参数比较难以理解 比如说arg-names,下面先从简单说起:
Aop类
- /**
- * 需要织入的类,及其方法。
- * @author ChdYan
- * @since jdk1.6
- */
- public class TestAop {
- /**
- * 在目标方法前织入的方法
- * @param i 测试参数
- * @param name 测试参数
- * @param p 测试参数
- */
- public void before(String name, int age, String address) {
- System.out.println(name + "," + age + "," + address);
- System.out.println("--------------开始啦before------------");
- }
- /**
- * 在目标方法返回前织入的方法
- * @param i
- * @param name
- * @param p
- */
- public void after(String name, int age, String address) {
- System.out.println(name + "," + age + "," + address);
- System.out.println("--------------开始啦after------------");
- }
- /**
- * 在目标方法前后织入的方法
- * @param pjp
- * @param name
- * @param age
- * @throws Throwable
- */
- public void around(ProceedingJoinPoint pjp) throws Throwable {
- System.out.println(Arrays.toString(pjp.getArgs()));
- System.out.println("--------------开始啦around------------");
- pjp.proceed(pjp.getArgs());
- System.out.println("--------------结束啦around------------");
- }
- /**
- * 在目标方法返回后后织入的方法
- * @param name
- */
- public void afterReturning(String name){
- System.out.println("======after Return==== " + name);
- }
- /**
- * 在目标方法返回后后织入的方法
- * @param name
- */
- public void afterThrowing(Exception e){
- System.out.println("======after Return====e " + e);
- }
- }
befor、after里都有三个参数。下面看需要织入的类
- /**
- * 简单测试类,测试织入增强。
- * @author ChdYan
- <a href="mailto:*@since">* @since</a> jdk1.6
- */
- public class User {
- private String username;
- /**
- * 需要织入的方法
- * @param name 名字
- * @param age 姓名
- * @param address 地址
- * @return 用户名称
- */
- public String getUsername(String name, int age, String address) {
- System.out.println("------------调用方法开始:-------");
- System.out.println(name + "----" + age + "----" + address);
- System.out.println("------------调用方法结束:-------");
- return username;
- }
- /**
- * 需要织入的方法
- * @param name 名称
- * @return 用户名称
- */
- public String getUsername(String name) {
- System.out.println("------------调用方法开始:-------");
- System.out.println(name + "----");
- System.out.println("------------调用方法结束:-------");
- if(1 == 1) {
- throw new RuntimeException();
- }
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- }
织入类比较简单,明白意思就行。
- <bean class="cn.g.model.User" id="user">
- <property name="username" value="zhangshan"></property>
- </bean>
- <bean id="aopTest" class="cn.g.aop.TestAop"></bean>
- <aop:config proxy-target-class="true">
- <aop:pointcut expression="execution(* cn.g.model.*.get*(..)) and args(arg1, arg2, arg3)" id="acut"/>
- <aop:aspect ref="aopTest">
- <aop:before method="before" pointcut-ref="acut" arg-names="arg1, arg2, arg3"/>
- <aop:after method="after" pointcut-ref="acut" arg-names="arg1, arg2, arg3"/>
- <aop:around method="around" pointcut="execution(* cn.g.model.*.get*(..))"/>
- <aop:after-returning method="afterReturning" pointcut="execution(* cn.g.model.*.get*(..))" returning="arg" arg-names="arg"/>
- <aop:after-throwing method="afterThrowing" pointcut="execution(* cn.g.model.*.get*(..))" throwing="arg" arg-names="arg"/>
- </aop:aspect>
- </aop:config>
expression="execution(* cn.g.model.*.get*(..)) and args(arg1, arg2, arg3)" args在这里是作为织入方法的入参,所以其个数与类型需要与织入方法一致,并且与在<aop:before与<aop:after中的增强也要一致的,才能织入。主要原因是:1.方法前织入增强也只是知道方法入参,其他参数一概获取不到,那么只能用方法参数作为args的入参了。2.同样,方法后织入增强也是只知道方法的参数,其他一概不知。。
<aop:around 通知的入参 ProceedingJoinPoint pjp由spring自动注入,ProceedingJoinPoint pjp所含了所有的入参与目标方法等,所以不必增加像<aop:before中的arg-names和expression中也不必包含
<aop:after-returning 中增强的入参只有一个,就是织入方法的返回值,类型、个数要一致,所以很好理解。
<aop:after-throwing 同 <aop:after-returning 一样,增强中也只有一个入参且就是抛出的异常,所以类型、个数要一致,这也比较好理解
- /**
- * 测试类
- * @author ChdYan
- * @since jdk1.6
- */
- public class TestAop {
- public static void main(String[] args) {
- ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
- User user = ctx.getBean(User.class);
- System.out.println(user.getUsername("romico", 25, "china"));
- System.out.println(user.getUsername("romico"));
- }
- }
最后结果如图