菜鸟学习Spring——60s使用annotation实现简单AOP

26 篇文章 1 订阅 ¥9.90 ¥99.00
27 篇文章 1 订阅
这篇博客介绍了如何使用Spring的注解实现AOP。通过UserManager和UserManagerImpl的代码示例,展示了如何定义切面和通知。SecurityHandler.java和Client.java是关键组件,而applcationContext.xml配置文件用于装配bean。这种方式虽然侵入性强,但提供了便利的AOP使用体验。
摘要由CSDN通过智能技术生成
一、概述。
      AOP大家都知道切面编程,在Spring中annotation可以实现简单的AOP列子。下面还未大家介绍几个概念:
Aspect
对横切性关注点的模块化。
Advice
对横切性关注点的具体实现。
Pointcut
它定义了Advice应用到哪些JoinPoint上,对Spring来说是方法调用。
JoinPoint
Advice在应用程序上执行的点或时机,Spring只支持方法的JoinPoint,这个点也可以使属性修改, 如:Aspecj可以支持。
Weave
将Advice应用到Target Object上的过程叫织入,Spring支持的是动态织入。
Target Object
Advice被应用的对象。
Proxy
Spring AOP默认使用JDK的动态代理,它的代理是运行时创建,也可以使用CGLIB代理。
二、代码演示。
      为了实现使用annotation实现简单AOP我们还得加入下面几个包:
      SPRING_HOME/lib/aspectj/*.jar

目录结构:


UserManager.java和UserManagerImpl.java代码参照

http://blog.csdn.net/gwblue/article/details/39668211

中的UserManager.java和方法二的UserManagerImpl.java

SecurityHandler.java

	package com.tgb.spring;
	
	import org.aspectj.lang.annotation.Aspect;
	import org.aspectj.lang.annotation.Before;
	import org.aspectj.lang.annotation.Pointcut;
	
	@Aspect
	public class SecurityHandler{
		/**
		*确定需要使用checkSecurity使用方法的范围
		*/
		@Pointcut("execution(* add*(..))")
		private void addAddMethod(){}
		/**
		*Before是指在执行方法之前运行
		*After是只在执行方法之后运行
		*/
		@Before("addAddMethod()")
		private void checkSecurity(){
			System.out.println("checkSecurity");
	
		}
	
	
	}


Client.java

	package com.tgb.spring;
	
	import org.springframework.beans.factory.BeanFactory;
	import org.springframework.context.support.ClassPathXmlApplicationContext;
	
	import com.tgb.spring.UserManager;
	
	
	
	public class Client {
	
		public static void main(String[] args) {
			BeanFactory factory=new ClassPathXmlApplicationContext("applicationContext.xml");
			UserManager userManager=(UserManager) factory.getBean("userManager");
			userManager.addUser("张三", "123");
			userManager.delUser(1);
		}
	}


applcationContext.xml

	<?xml version="1.0" encoding="UTF-8"?>
	
	
	<beans xmlns="http://www.springframework.org/schema/beans"
		     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		     xmlns:aop="http://www.springframework.org/schema/aop"
		     xmlns:tx="http://www.springframework.org/schema/tx"
		     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
	           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
	           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
	<!-- 启用AspectJ -->
	<aop:aspectj-autoproxy/>
	
	<bean id="userManager" class="com.tgb.spring.UserManagerImpl" />
	<bean id="securityHandler" class="com.tgb.spring.SecurityHandler"/>
	</beans>


效果图:


三、综述。

      利用annotation方式简单的实现了AOP,注解是一种侵入性比较强的AOP实现方式,它的优点是让开发者更加方便的使用AOP。

Spring AOPSpring框架中的一个重要模块,它提供了面向切面编程(AOP)的支持。AOP是一种编程思想,它可以在不改变原有代码的情况下,通过在程序运行时动态地将代码“织入”到现有代码中,从而实现对原有代码的增强。 Spring AOP提供了基于注解的AOP实现,使得开发者可以通过注解的方式来定义切面、切点和通知等相关内容,从而简化了AOP使用。 下面是一个基于注解的AOP实现的例子: 1. 定义切面类 ```java @Aspect @Component public class LogAspect { @Pointcut("@annotation(Log)") public void logPointcut() {} @Before("logPointcut()") public void beforeLog(JoinPoint joinPoint) { // 前置通知 System.out.println("执行方法:" + joinPoint.getSignature().getName()); } @AfterReturning("logPointcut()") public void afterLog(JoinPoint joinPoint) { // 后置通知 System.out.println("方法执行完成:" + joinPoint.getSignature().getName()); } @AfterThrowing(pointcut = "logPointcut()", throwing = "ex") public void afterThrowingLog(JoinPoint joinPoint, Exception ex) { // 异常通知 System.out.println("方法执行异常:" + joinPoint.getSignature().getName() + ",异常信息:" + ex.getMessage()); } } ``` 2. 定义业务逻辑类 ```java @Service public class UserService { @Log public void addUser(User user) { // 添加用户 System.out.println("添加用户:" + user.getName()); } @Log public void deleteUser(String userId) { // 删除用户 System.out.println("删除用户:" + userId); throw new RuntimeException("删除用户异常"); } } ``` 3. 在配置文件中开启AOP ```xml <aop:aspectj-autoproxy/> <context:component-scan base-package="com.example"/> ``` 在这个例子中,我们定义了一个切面类LogAspect,其中通过@Aspect注解定义了一个切面,通过@Pointcut注解定义了一个切点,通过@Before、@AfterReturning和@AfterThrowing注解分别定义了前置通知、后置通知和异常通知。 在业务逻辑类中,我们通过@Log注解标注了需要增强的方法。 最后,在配置文件中,我们通过<aop:aspectj-autoproxy/>开启了AOP功能,并通过<context:component-scan>扫描了指定包下的所有组件。 这样,当我们调用UserService中的方法时,就会触发LogAspect中定义的通知,从而实现对原有代码的增强。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值