2014/3/27 Spring AOP编程心得

本文介绍了Spring框架中AOP(切面编程)的核心思想,包括切面、切点和增强概念。通过示例展示了如何在Controller方法中应用AOP,并实现测试功能。通过配置文件实现了对特定方法的增强处理,利用反射获取方法参数和类信息,以及如何通过注解进行功能控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

笔者今日对于Spring的核心思想之一的AOP(切面编程)进行了初步理解与接触,学的不太好,结合书本基本上还是理解实现了AOP编程,废话不多说,以下是Demo:

本人认为AOP就是一些类拥有的共同的功能代码,提取出来,像是用刀子横切了这些类一样,然后有切面,切面包含切点(cutPoint)和增强(Advice)

1.首先是Controller里的方法和工程路径


第二个红框表示我使用AOP的入口


IndexController.java中的aop方法

/**
     * 
     * 测试aop切面编程配置文件: <br>
     * 〈功能详细描述〉
     *
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    @ResponseBody
    @RequestMapping("/aop.action")
    @NeedTest(flag = true)
    public Map<String, Object> aop(){
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("name", "suning");
        return map;
    }
我定义了一个NeedTest标签,表示是否要测试,参数为true


2.对应此标签有一个接口

NeedTest.java

package com.suning.sample.interfaces;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(value = RetentionPolicy.RUNTIME)   //运行时加载jvm,并支持反射查找注解
public @interface NeedTest {
    boolean flag();
}
注意的是@interface是要求格式,该接口中定义的抽象方法必须无参


3:切面配置文件

application-aop.xml

<!-- 植入aop增强 -->
	<aop:config proxy-target-class="true">
		<aop:aspect ref="needTest">
			<aop:pointcut expression="execution(* com.suning.sample.web.*.*(..))"
				id="needTestPointcut" />
			<aop:after-returning method="needTestMethod"
				pointcut-ref="needTestPointcut" returning="map"/>
		</aop:aspect>
	</aop:config>
	<bean id="needTest" class="com.suning.sample.interfaces.NeedTestImp"></bean>

<aop:config proxy-target-class="true">
true表示我使用CGLib代理,false代表使用JDK代理,代理没有吃透,待学习


<aop:pointcut expression="execution(* com.suning.sample.web.*.*(..))"
				id="needTestPointcut" />
			<aop:after-returning method="needTestMethod"
				pointcut-ref="needTestPointcut" returning="map"/>
代表我扫描com.suning.sample.web下所有的类的所有的方法,只有当方法返回一个map对象,才会调用NeedTestImp.java类的needTestMethod方法,并把map对象传进去


4.相关的java类

NeedTestImp.java

package com.suning.sample.interfaces;

import java.lang.reflect.Method;
import java.util.Map;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class NeedTestImp {
    
    private static final Logger logger = LoggerFactory.getLogger(NeedTestImp.class);
    
    public void needTestMethod(JoinPoint joinPoint, Map<String,Object> map){
        System.out.println("根据flag判断是否允许测试");
        //得到类路径
        String classType = joinPoint.getTarget().getClass().getName();
        logger.debug("类路径" + classType);
        // 得到方法名
        String methodName = joinPoint.getSignature().getName();
        MethodSignature jp = (MethodSignature) joinPoint.getSignature();
        Method method = jp.getMethod();
        // 得到方法参数
        Class<?>[] parameterTypes = method.getParameterTypes();
        Class<?> className = null;
    }
}

这里主要是为了展示我传入的map对象以及IndexController.java中的aop方法有关参数

如下:



心得:AOP编程有点像黑客,给某些切入点追加代码,可以在方法前,后等。追加的代码是自己定义的。偷笑







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值