`
Donald_Draper
  • 浏览: 979710 次
社区版块
存档分类
最新评论

基于注解的Spring AOP

阅读更多
Spring AOP 基本概念:http://hotstrong.iteye.com/blog/1330046
JoinPoint API:http://blog.csdn.net/a9529lty/article/details/7031070
1.定义注解
@Target({ ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TestAnnotation {

	String value() default "";

}

2.定义切面
/**
 *  切面(Aspect):在Spring AOP中,切面可以使用通用类或者在普通类中以@Aspect 注解(@AspectJ风格)来实现
 * @author donald
 *
 */
@Aspect
@Component
public class testAspect {

	private static final Logger logger = LoggerFactory.getLogger(testAspect.class);
	/**
	 * @Pointcut定义出一个或一组方法,当执行这些方法时可产生通知,Spring缺省使用AspectJ切入点语法。
	 */
    //定义切点
	@Pointcut("@annotation(com.controller.test.TestAnnotation)")
	public void testAspect() {}

	/**
	 * 前置通知处理
	 * @param joinPoint,在Spring AOP中一个连接点代表一个方法的执行
	 * 通知(Advice):在切面的某个特定的连接点(Joinpoint)上执行的动作。
	 * 通知有各种类型,其中包括"around"、"before”和"after"等通知。
	 * 许多AOP框架,包括Spring,都是以拦截器做通知模型, 并维护一个以连接点为中心的拦截器链
	 */
	/** 通知类型
     * 前置通知(@Before):在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)
     *(返回后通知(@AfterReturning):在某连接点(join point)正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回
     * 抛出异常后通知(@AfterThrowing):方法抛出异常退出时执行的通知
     * 后通知(@After):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)
     * 环绕通知(@Around):包围一个连接点(join point)的通知,如方法调用。
     * 这是最强大的一种通知类型,环绕通知可以在方法调用前后完成自定义的行为,
     * 它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。
     * */
	@Before("testAspect()")
	public void doBefore(JoinPoint joinPoint) {
		try {
			System.out.println("=====start=====");
			System.out.println("class.method:" + (joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName() + "()"));
			System.out.println("value:" + getMethodValue(joinPoint));
			System.out.println("=====end=====");
		} catch (Exception e) {
			// 记录本地异常日志
			logger.error("=======exception======");
			logger.error("exception", e.getMessage());
		}
	}
/**
 * 获取方法注解的值
 * @param joinPoint
 * @return
 * @throws Exception
 */
	@SuppressWarnings("rawtypes")
	public static String getMethodValue(JoinPoint joinPoint) throws Exception {
		//根据连接点获取class
		String targetName = joinPoint.getTarget().getClass().getName();
		//根据连接点获取method
		String methodName = joinPoint.getSignature().getName();
		//根据连接点获取args
		Object[] arguments = joinPoint.getArgs();
		Class targetClass = Class.forName(targetName);
		Method[] methods = targetClass.getMethods();
		String value = "";
		//获取注解连接点的值
		for (Method method : methods) {
			if (method.getName().equals(methodName)) {
				Class[] clazzs = method.getParameterTypes();
				if (clazzs.length == arguments.length) {
					value = method.getAnnotation(TestAnnotation.class).value();
					break;
				}
			}
		}
		return value;
	}
}

3.在Controller中使用注解
@Controller
@RequestMapping(value = "/test")
public class testController extends BaseController {
	Log log = LogFactory.getLog(testController.class);
	@RequestMapping(value = "/charts")
	@TestAnnotation("测试fusioncharts")
	public String testFusionCharts(HttpServletRequest request,HttpServletResponse response,Model model) {
		log.info("====Start-charts");
		String strXML="<graph caption='Monthly Unit Sales' xAxisName='Month'" +
				" yAxisName='Units' decimalPrecision='0' formatNumberScale='0'>"+
	    "<set name='Jan' value='462' color='AFD8F8' />"+
	    "<set name='Feb' value='857' color='F6BD0F' />"+
	    "<set name='Mar' value='671' color='8BBA00' />"+
	    "<set name='Apr' value='494' color='FF8E46' />"+
	    "<set name='May' value='761' color='008E8E' />"+
	    "<set name='Jun' value='960' color='D64646' />"+
	    "<set name='Jul' value='629' color='8E468E' />"+
	    "<set name='Aug' value='622' color='588526' />"+
	    "<set name='Sep' value='376' color='B3AA00' />"+
	    "<set name='Oct' value='494' color='008ED6' />"+
	    "<set name='Nov' value='761' color='9D080D' />"+
	    "<set name='Dec' value='960' color='A186BE' />"+
	"</graph>";
		model.addAttribute("strXML", strXML);
		log.info("====End-charts");
		return "test/charts";
	}
}

4.启动aop注解
<!--通知spring使用cglib而不是jdk的来生成代理方法 AOP可以拦截到Controller 必须放在ApplicationContext-mvc.xml文件中-->
<aop:aspectj-autoproxy proxy-target-class="true" />
5.启动web访问host:8080/webName/test/charts,控制台输出:
=====start=====
class.method:com.fh.controller.test.testController.testFusionCharts()
value:测试fusioncharts
=====end=====
2016-05-31 16:02:53 -65343 [http-bio-80-exec-5] INFO    - ====Start-charts
2016-05-31 16:02:53 -65346 [http-bio-80-exec-5] INFO    - ====End-charts
分享到:
评论

相关推荐

    基于注解实现SpringAop

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

    Spring基于注解实现AOP

    本篇文章将深入探讨如何在Spring中通过注解实现AOP。 首先,了解AOP的基本概念。面向切面编程是一种编程范式,它允许程序员定义“切面”,这些切面包含了跨越多个对象的行为或责任。切点是这些行为插入到主业务逻辑...

    Spring 基于注解方式实现AOP

    在Spring框架中,基于注解的AOP(面向切面编程)是一种强大的工具,它允许开发者无需编写XML配置即可实现切面。这种编程方式极大地提高了代码的可读性和可维护性。下面我们将深入探讨如何使用注解来实现Spring AOP。...

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

    2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑实现 (需要知道原理的请看spring aop源码,此处不做赘述) 3、可在现有源码上快速进行功能扩展 4、spring boot,mybatis,druid,spring aop的使用

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

    5. **@EnableAspectJAutoProxy**: 在Spring配置类上添加此注解,启用基于Java代理的AOP支持,这样Spring会自动检测并处理带有@Aspect注解的类。 ```java @Configuration @EnableAspectJAutoProxy public class ...

    注解方式实现AOP编程

    在Spring框架中,AOP的实现有两种主要方式:一种是基于XML配置,另一种是基于注解。本篇将主要讨论如何通过注解方式来实现AOP编程。 首先,我们需要了解Spring中的核心注解。`@Aspect`是定义一个切面的注解,通常会...

    spring aop注解版

    在本主题中,我们将深入探讨Spring AOP的注解版,它是基于Java注解的实现,简化了配置并提高了代码的可读性。 首先,让我们理解AOP的基本概念。AOP是一种编程范式,允许程序员定义“切面”,这些切面封装了跨越多个...

    spring aop jar 包

    在使用Spring AOP时,我们可以通过XML配置或注解的方式来定义切面。例如,可以使用`@Aspect`注解定义一个切面类,`@Before`、`@After`等注解来声明通知,`@Pointcut`定义切点表达式。 在实际开发中,Spring AOP广泛...

    AOP的相关概念,基于XML的AOP的配置,基于注解的AOP配置

    4. **启动注解支持**:在Spring配置文件中启用基于注解的AOP支持,使用`&lt;aop:aspectj-autoproxy/&gt;`。 ### 总结 无论是基于XML的AOP配置还是基于注解的AOP配置,其核心都是将横切关注点从业务逻辑中分离出来,从而...

    基于注解配置和使用spring AOP(spring mvc框架)

    本篇文章将深入探讨如何在Spring MVC中配置和使用基于注解的AOP。 一、Spring AOP基础知识 1. **切面(Aspect)**:切面是关注点的模块化,例如日志、事务管理等。在Spring AOP中,切面可以是Java类或@Aspect注解...

    Spring AOP 16道面试题及答案.docx

    Spring支持两种AOP的实现方式:Spring AspectJ注解风格和Spring XML配置风格。使用AspectJ注解风格是最常见的,它允许开发者直接在方法上使用注解来定义切面。 Spring AOP中有五种不同类型的的通知(Advice): 1....

    使用注解实现AOP

    在Java世界中,Spring框架提供了基于注解的AOP实现,大大简化了AOP的使用。本篇文章将深入探讨如何使用注解实现AOP,以及其背后的原理。 首先,我们需要了解Spring AOP中的几个核心概念: 1. 切面(Aspect):切面...

    spring AOP注解的应用1

    本篇主要探讨的是如何利用Spring AOP的注解来实现这些功能,包括前置通知、后置通知、返回通知和异常通知。 ### 前置通知(Before通知) 前置通知在目标方法执行之前运行。在Spring AOP中,我们使用`@Before`注解...

    基于注解的aop的小DEMO

    本小DEMO将演示如何在Spring MVC环境中集成并使用基于注解的AOP。 首先,我们来理解AOP的核心概念。AOP的目标是将那些影响多个类的代码(如日志、事务管理、性能监控等)抽取出来,形成独立的模块,称为切面。切点...

    spring注解aop配置详解

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

    SpringBoot基于注解实现Aop

    通过以上内容,你已经掌握了如何在Spring Boot中基于注解实现AOP的基本步骤。在实际项目中,你可以结合自己的需求,灵活运用这些知识来实现诸如日志记录、事务管理、性能监控等功能。在`aop-guide`这个项目中,你...

    Spring Aop四个依赖的Jar包

    Spring AOP就是基于这些接口进行设计的,因此这个库是Spring AOP和其他AOP实现之间协作的基础。 在实际使用中,我们需要在项目的类路径下包含这些Jar包,并在Spring配置文件中启用AOP支持。例如,可以通过以下XML...

    spring aop注解方式、xml方式示例

    下面将详细介绍Spring AOP的注解方式和XML配置方式。 ### 注解方式 #### 1. 定义切面(Aspect) 在Spring AOP中,切面是包含多个通知(advisors)的类。使用`@Aspect`注解标记切面类,例如: ```java @Aspect ...

    Spring AOP完整例子

    Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许开发者在不修改源代码的情况下,通过插入切面来增强或改变程序的行为。在本教程中,我们将深入探讨Spring AOP的不同使用方法,包括定义切点、通知类型...

    08 基于注解的AOP实现.rar

    基于注解的AOP实现是Spring提供的一种便捷方式,使得开发者无需编写XML配置文件即可实现切面。本篇将深入探讨如何在Spring中使用注解进行AOP编程。 首先,我们需要理解AOP的基本概念。AOP的核心是切面(Aspect),...

Global site tag (gtag.js) - Google Analytics