`
wenjinglian
  • 浏览: 824686 次
  • 性别: Icon_minigender_1
  • 来自: 株洲->深圳
社区版块
存档分类
最新评论

Spring注解Aop简单使用

阅读更多

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
分享到:
评论
1 楼 remzhang 2013-01-29  

相关推荐

    spring注解aop demo

    **二、Spring注解AOP的使用** 在Spring中,我们可以使用注解来声明切面、定义切点以及通知。主要的注解包括: 1. **@Aspect**: 标记一个类作为切面,通常包含切点表达式和通知方法。 2. **@Before**: 前置通知,...

    基于注解实现SpringAop

    基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop

    spring-aop-5.2.0.RELEASE-API文档-中文版.zip

    赠送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;...

    spring-aop-jar

    在IT领域,Spring框架是一个广泛使用的Java应用框架,它提供了许多功能,包括依赖注入、面向切面编程(AOP)等。"spring-aop-jar"这个主题涉及到Spring框架中的核心组件之一——Spring AOP。这里我们将深入探讨...

    使用Spring的注解方式实现AOP的细节

    以上就是Spring注解方式实现AOP的一些核心细节。通过这种方式,我们可以方便地在不修改原有代码的情况下,为服务添加额外的功能,实现代码的解耦和复用。不过,需要注意的是,过度使用AOP可能会导致代码可读性和可...

    spring注解aop配置详解

    本篇将深入讲解如何通过注解来配置Spring AOP,以实现更加简洁、高效的代码编写。 首先,我们来看注解在Spring AOP中的应用。在传统的AOP配置中,我们需要定义切入点表达式和通知(advice)在XML配置文件中。然而,...

    spring-aop-5.0.10.RELEASE-API文档-中文版.zip

    赠送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....

    spring-aop-5.0.8.RELEASE-API文档-中英对照版.zip

    赠送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

    本示例是关于如何在Spring Boot项目中实现AOP功能的一个简单演示。 首先,我们需要了解AOP的基本概念。AOP的核心是切面(Aspect),它封装了跨越多个对象的行为或关注点,如日志记录。切点(Pointcut)定义了在何处...

    spring的aop简单例子

    这个简单例子将帮助我们理解AOP的基本概念和如何在Spring框架中实现它。 首先,我们要知道AOP的核心概念:切面、通知、连接点、切点、目标对象和代理。切面是包含横切关注点(如日志记录、事务管理等)的模块化组件...

    Spring 2.5 AOP 例子

    Spring 2.5 AOP(面向切面编程)是Java应用程序中的一个重要概念,它允许开发者在不修改原有代码的情况下插入新的行为或监控。这个例子旨在帮助我们理解和应用Spring框架的AOP特性。以下是对该主题的详细解释: 一...

    spring aop 自定义注解保存操作日志到mysql数据库 源码

    一、适合人群 1、具备一定Java编程基础,初级开发者 2、对springboot,mybatis,mysql有基本认识 3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 ...4、spring boot,mybatis,druid,spring aop的使用

    spring-aop-5.3.12-API文档-中英对照版.zip

    赠送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...

    spring-aop-5.3.10-API文档-中文版.zip

    赠送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之AOP(动态代理)

    在Spring Boot项目中,配置和使用AOP相对简单。首先,我们需要引入Spring AOP和AspectJ的依赖,这通常在pom.xml或build.gradle文件中完成。然后,我们可以定义一个切面(Aspect),它包含通知(Advice)——即在特定...

    spring2.5.6 aop简单示例

    下面,我们来看看如何设置和使用Spring AOP: 1. **配置AOP**:在Spring的XML配置文件中,你需要启用AOP并定义切面。这通常包括引入`&lt;aop:config&gt;`和`&lt;aop:aspect&gt;`元素。例如: ```xml &lt;aop:config&gt; &lt;aop:...

    Spring基础:Spring AOP简单使用

    - **注解配置**:Spring 2.5引入了基于注解的AOP,可以直接在切面类上使用@Aspect,@Before、@After、@Around等注解定义通知,@Pointcut定义切点。 4. **切点表达式** - 切点表达式是用于匹配连接点的语句,如`...

    spring-aop-5.2.15.RELEASE-API文档-中文版.zip

    赠送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....

    spring-aop-5.1.3.RELEASE-API文档-中英对照版.zip

    赠送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;...

Global site tag (gtag.js) - Google Analytics