SpringAOP使用入门,如何对自定义的注解进行切面编程
来源:互联网 发布:域名交易市场 编辑:程序博客网 时间:2024/06/10 15:01
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();
<!-- 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();
0 0
- SpringAOP使用入门,如何对自定义的注解进行切面编程
- AOP如何对自定义注解进行切面编程
- SpringAop切面的简单使用
- springAOP进行自定义注解,用于方法的处理
- 切面和自定义注解的配合使用
- SpringAOP入门学习一:基于注解配置切面( AspectJ)
- 使用SpringAOP切面实现对controller的拦截,并对url,参数和返回值记录
- 关于springAOP,面向切面编程
- aop注解 自定义切面的注解写法
- aop注解 自定义切面的注解写法
- aop注解 自定义切面的注解写法
- SpringAOP实现自定义注解
- spring学习笔记7--使用spring进行面向切面的(AOP)编程(1)注解方式实现
- 基于SSM利用SpringAOP切面及自定义注解 记录每次操作记录(操作日志 同理)
- 面向切面的 Spring —— 如何使用注解创建切面?
- SpringAOP:目标类如何向切面类中传参
- 基于注解的SpringAOP
- springAOP的注解
- JS 设计模式单例模式
- 终于要git push了
- java.lang.Class.getDeclaredMethod()方法
- Session 与 Cookie 的区别
- CodeForces 721C Journey(DP)
- SpringAOP使用入门,如何对自定义的注解进行切面编程
- forward和serdredirect的区别
- Ubuntu怎么查看github安装目录
- Cause: java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
- 优雅编程之这样简化表达式,你就“正常”了(二十三)
- APACHE FALCON CLI
- 02.Spring Ioc 容器 - 创建
- JS 模块模式
- 深入探索Android 中view的touch事件传递