您的位置:首页 > 编程语言 > Java开发

SpringAOP使用入门,如何对自定义的注解进行切面编程

2016-09-27 21:29 1031 查看
spring AOP需要的jar包
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
<dependency>
   <groupId>org.aspectj</groupId>
   <artifactId>aspectjrt</artifactId>
   <version>1.7.3</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
   <groupId>org.aspectj</groupId>
   <artifactId>aspectjweaver</artifactId>
   <version>1.7.3</version>
</dependency>

<!-- https://mvnrepository.com/artifact/cglib/cglib-nodep -->
<dependency>
   <groupId>cglib</groupId>
   <artifactId>cglib-nodep</artifactId>
   <version>2.1_3</version>
</dependency>

主要配置信息:
设置切面代理
<aop:aspectj-autoproxy proxy-target-class="true" />
注入切面的类
<bean id="aspect" class="com.aspect.TestAnnoction" />
在service层做切面
<bean id="testAnnoctionService" class="com.service.TestAnnoctionService" />

说明我是在自定义的注解上做的切面
注解类代码:
package com.Annotion;

import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface MyAnnoction {

String key() default "";
}

切面类代码:

package com.aspect;

import java.lang.reflect.Method;

import java.lang.reflect.Modifier;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.Signature;

import org.aspectj.lang.annotation.Around;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Pointcut;

import org.aspectj.lang.reflect.MethodSignature;

import org.springframework.aop.framework.AopProxyUtils;

import org.springframework.core.BridgeMethodResolver;

import org.springframework.stereotype.Component;

import org.springframework.util.ClassUtils;

import com.Annotion.MyAnnoction;

@Component

@Aspect

public class TestAnnoction {

// @Pointcut("execution(* com.service.TestAnnoction.testMyAnnoction(..))")

//    public void testMyAnnoction(){}

public TestAnnoction() {
System.out.println("我是一个构造器111");
}

// @Around(value = "@annotation(com.Annoction.MyAnnoction)")

// @Around(value = "testMyAnnoction()")
@Around(value = "@annotation(com.Annotion.MyAnnoction)")
public Object testMyAnnoction(ProceedingJoinPoint pj) throws Throwable{
System.out.println("========================");
Object target = pj.getTarget();
System.out.println(target.toString());
Class<?> cls = getTargetClass(target);
Method specificMethod = getSpecificMethod(pj, cls);
if (!Modifier.isPublic(specificMethod.getModifiers())) {

            return pj.proceed();//这是判断是否执行真实的方法体

        }
MyAnnoction ma = specificMethod.getAnnotation(MyAnnoction.class);
String key = ma.key();
System.out.println("当前测试的key:" + key);
return new Object();

}

    /**

     * 获取目标Class

     *

     * @param target

     * @return

     */

    private Class<?> getTargetClass(Object target) {

        Class<?> targetClass = AopProxyUtils.ultimateTargetClass(target);

        if (targetClass == null) {

            targetClass = target.getClass();

        }

        return targetClass;

    }

    

    /**

     * 获取指定方法

     *

     * @param pjp

     * @param targetClass

     * @return

     */

    private Method getSpecificMethod(ProceedingJoinPoint pjp, Class<?> targetClass) {

        Signature signature = pjp.getSignature();

        MethodSignature methodSignature = (MethodSignature) signature;

        Method method = methodSignature.getMethod();

        Method specificMethod = ClassUtils.getMostSpecificMethod(method, targetClass);

        specificMethod = BridgeMethodResolver.findBridgedMethod(specificMethod);

        return specificMethod;

    }

}

Service层使用
@MyAnnoction(key="1")
public void testMyAnnoction(){
System.out.println("是否开始执行我的数据1");
}

@MyAnnoction(key="0")
public void testMyAnnoction1(){
System.out.println("是否开始执行我的数据0");
}

Controller注入service使用
@Autowired
private TestAnnoction testAnnoctionService;
//开始调用
testAnnoctionService.testMyAnnoction();
//开始调用
testAnnoctionService.testMyAnnoction1();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: