Spring注解Aop简单使用
结构:
相关代码配置:
Anno.java
package com.nassir.aop;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 注解
*
* @author nassir wen
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD })
public @interface Anno {
String isAop() default "Y";
}
Aop.java
package com.nassir.aop;
import java.lang.reflect.Method;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.JoinPoint;
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.stereotype.Component;
/**
* AOP
* @author nassir wen
*/
@Aspect
@Component
public class Aop
{
private final static Log logger = LogFactory.getLog(Aop.class);
/**
* 定义一个切入点,在方法含@Anno注解位置切入
*/
@Pointcut("@annotation(com.nassir.aop.Anno)")
public void aopPoint()
{
}
/**
* @param jp
* @return
*/
@Around("aopPoint()")
public Object execAop(ProceedingJoinPoint jp) throws Throwable
{
long start = System.currentTimeMillis();
Method method = getMethod(jp);
Anno anno = method.getAnnotation(Anno.class);
String methodName = method.getName();
String aop = anno.isAop();
Object retVal = null;
if (logger.isInfoEnabled()) {
logger.info("begin exec fun ######: " + methodName);
}
if (StringUtils.equalsIgnoreCase(aop,"Y"))
{
retVal = jp.proceed();
}else {
//如果注解aop不为"Y/y"返回err
retVal = "err";
}
if (logger.isInfoEnabled()) {
logger.info("end exec fun ######: " + methodName);
}
if (logger.isInfoEnabled()) {
logger.info("spend time : " + (System.currentTimeMillis()-start) + "ms");
}
return retVal;
}
private Method getMethod(JoinPoint jp) throws NoSuchMethodException
{
Signature sig = jp.getSignature();
MethodSignature msig = (MethodSignature) sig;
return getClass(jp).getMethod(msig.getName(),
msig.getParameterTypes());
}
private Class<? extends Object> getClass(JoinPoint jp) throws NoSuchMethodException{
return jp.getTarget().getClass();
}
}
AopTarget.java
package com.nassir.test;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Component;
import com.nassir.aop.Anno;
/**
* @author nassir wen
* @data 2012-3-13 下午12:53:13
*/
@Component
public class AopTarget {
private final static Log logger = LogFactory.getLog(AopTarget.class);
@Anno(isAop = "y")
public String exec() {
logger.info("exec...");
return "suc";
}
}
applicationContext.xml
<!-- 使用annotation 自动注册bean,并保证@Required,@Autowired的属性被注入 -->
<context:annotation-config/>
<!-- aop动态代理 -->
<aop:aspectj-autoproxy/>
<!-- 扫描注解对象 -->
<context:component-scan base-package="com.nassir" />
main.java:
public class Main {
public static void main(String[] args) {
ClassPathXmlApplicationContext beanApp = new ClassPathXmlApplicationContext(
"applicationContext.xml");
AopTarget aopTarget = (AopTarget) beanApp.getBean("aopTarget");
System.out.println("result: ######: " + aopTarget.exec());
}
}
测试:
@Anno(isAop = "y")
public String exec()
结果:
2012-03-13 14:01:59 [INFO] [Aop.java->execAop(53)] begin exec fun ######: exec
2012-03-13 14:01:59 [INFO] [AopTarget.java->exec(22)] exec...
2012-03-13 14:01:59 [INFO] [Aop.java->execAop(63)] end exec fun ######: exec
2012-03-13 14:01:59 [INFO] [Aop.java->execAop(67)] spend time : 16ms
result: ######: suc
@Anno(isAop = "n")
public String exec()
2012-03-13 13:58:05 [INFO] [Aop.java->execAop(53)] begin exec fun ######: exec
2012-03-13 13:58:05 [INFO] [Aop.java->execAop(63)] end exec fun ######: exec
2012-03-13 13:58:05 [INFO] [Aop.java->execAop(67)] spend time : 0ms
result: ######: err
附件下载。
- 大小: 13.7 KB
分享到:
相关推荐
**二、Spring注解AOP的使用** 在Spring中,我们可以使用注解来声明切面、定义切点以及通知。主要的注解包括: 1. **@Aspect**: 标记一个类作为切面,通常包含切点表达式和通知方法。 2. **@Before**: 前置通知,...
基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop
赠送jar包:spring-aop-5.2.0.RELEASE.jar; 赠送原API文档:spring-aop-5.2.0.RELEASE-javadoc.jar; 赠送源代码:spring-aop-5.2.0.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.2.0.RELEASE.pom;...
在IT领域,Spring框架是一个广泛使用的Java应用框架,它提供了许多功能,包括依赖注入、面向切面编程(AOP)等。"spring-aop-jar"这个主题涉及到Spring框架中的核心组件之一——Spring AOP。这里我们将深入探讨...
以上就是Spring注解方式实现AOP的一些核心细节。通过这种方式,我们可以方便地在不修改原有代码的情况下,为服务添加额外的功能,实现代码的解耦和复用。不过,需要注意的是,过度使用AOP可能会导致代码可读性和可...
本篇将深入讲解如何通过注解来配置Spring AOP,以实现更加简洁、高效的代码编写。 首先,我们来看注解在Spring AOP中的应用。在传统的AOP配置中,我们需要定义切入点表达式和通知(advice)在XML配置文件中。然而,...
赠送jar包:spring-aop-5.0.10.RELEASE.jar; 赠送原API文档:spring-aop-5.0.10.RELEASE-javadoc.jar; 赠送源代码:spring-aop-5.0.10.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.0.10.RELEASE....
赠送jar包:spring-aop-5.0.8.RELEASE.jar; 赠送原API文档:spring-aop-5.0.8.RELEASE-javadoc.jar; 赠送源代码:spring-aop-5.0.8.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.0.8.RELEASE.pom;...
本示例是关于如何在Spring Boot项目中实现AOP功能的一个简单演示。 首先,我们需要了解AOP的基本概念。AOP的核心是切面(Aspect),它封装了跨越多个对象的行为或关注点,如日志记录。切点(Pointcut)定义了在何处...
这个简单例子将帮助我们理解AOP的基本概念和如何在Spring框架中实现它。 首先,我们要知道AOP的核心概念:切面、通知、连接点、切点、目标对象和代理。切面是包含横切关注点(如日志记录、事务管理等)的模块化组件...
Spring 2.5 AOP(面向切面编程)是Java应用程序中的一个重要概念,它允许开发者在不修改原有代码的情况下插入新的行为或监控。这个例子旨在帮助我们理解和应用Spring框架的AOP特性。以下是对该主题的详细解释: 一...
一、适合人群 1、具备一定Java编程基础,初级开发者 2、对springboot,mybatis,mysql有基本认识 3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 ...4、spring boot,mybatis,druid,spring aop的使用
赠送jar包:spring-aop-5.3.12.jar; 赠送原API文档:spring-aop-5.3.12-javadoc.jar; 赠送源代码:spring-aop-5.3.12-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.3.12.pom; 包含翻译后的API文档:spring...
赠送jar包:spring-aop-5.3.10.jar; 赠送原API文档:spring-aop-5.3.10-javadoc.jar; 赠送源代码:spring-aop-5.3.10-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.3.10.pom; 包含翻译后的API文档:spring...
在Spring Boot项目中,配置和使用AOP相对简单。首先,我们需要引入Spring AOP和AspectJ的依赖,这通常在pom.xml或build.gradle文件中完成。然后,我们可以定义一个切面(Aspect),它包含通知(Advice)——即在特定...
下面,我们来看看如何设置和使用Spring AOP: 1. **配置AOP**:在Spring的XML配置文件中,你需要启用AOP并定义切面。这通常包括引入`<aop:config>`和`<aop:aspect>`元素。例如: ```xml <aop:config> <aop:...
- **注解配置**:Spring 2.5引入了基于注解的AOP,可以直接在切面类上使用@Aspect,@Before、@After、@Around等注解定义通知,@Pointcut定义切点。 4. **切点表达式** - 切点表达式是用于匹配连接点的语句,如`...
赠送jar包:spring-aop-5.2.15.RELEASE.jar; 赠送原API文档:spring-aop-5.2.15.RELEASE-javadoc.jar; 赠送源代码:spring-aop-5.2.15.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.2.15.RELEASE....
赠送jar包:spring-aop-5.1.3.RELEASE.jar; 赠送原API文档:spring-aop-5.1.3.RELEASE-javadoc.jar; 赠送源代码:spring-aop-5.1.3.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.1.3.RELEASE.pom;...