Spring详解之二:AOP(面向切面)

##一、首先在Spring的xml配置文件中引入AOP的命名空间 ##二、进行面向切面的两种方式: ###(一)基于xml配置方式进行AOP开发

  • 1、首先定义一个普通的切面类MyInterceptor

      public class MyInteceptor{
    
      	public void doAccessCheck(){
      		System.out.println("前置通知")
      	}
    
      	public void doAfterReturning(){
      		System.out.println("后置通知")
      	}
    
      	public void doAfter(){
      		System.out.println("最终通知")
      	}
    
      	public void doAfterThrowing(){
      		System.out.println("例外通知")
      	}
    
      	public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
      		System.out.println("环绕通知")
      		Object result = pjp.proceed();
      		return result;
      	}
      }
    
  • 2、在Spring的xml配置文件中进行如下配置

      <beans……>
      	<aop:aspectj-autoproxy/>
    
      	<!--将MyInterceptor类纳入Spring容器进行管理-->
      	<bean id="myInterceptor" class="com.abinge.aop.MyInterceptor">
    
      	<!--将MyInterceptor类配置为切面-->
      	<aop:config>
      		<aop:aspect id="myAsp" ref="myInterceptor">
      			<aop:pointcut id="mycut" expression="execution(* com.abinge.aop.PersonServiceBean.*(..))"/>
      			<aop:before pointcut-ref="mycut" method="doAccessCheck">
      			<aop:after-returning pointcut-ref="mycut" method="doAfterReturning">
      			<aop:after-throwing pointcut-ref="mycut" method="doAfterThrowing">
      			<aop:after pointcut-ref="mycut" method="doAfter">
      			<aop:around pointcut-ref="mycut" method="doBasicProfiling">
      		</aop:aspect>
      	</aop:config>
      </beans>
    

###(二)基于注解方式进行AOP开发

  • 1、首先在Spring的xml配置文件中的根标签beans中添加如下子标签:

      <beans……>
      	<aop:aspectj-autoproxy/>
      </beans>
    
  • 2、定义一个切面类MyInterceptor

      @Aspect //@Aspect表示这是一个切面类
      public class MyInteceptor{
      	//声明一个切入点,拦截com.abinge.aop.PersonServiceBean类中的所有方法
      	@Pointcut("execution(* com.abinge.aop.PersonServiceBean.*(..))")
      	private void anyMethod(){}//声明一个切入点
    
      	@Before("anyMethod()") //添加前置通知,需要将切入点的名称填入
      	public void doAccessCheck(){
      		System.out.println("前置通知")
      	}
      	@AfterReturning("anyMethod()") //添加后置通知,需要将切入点的名称填入
      	public void doAfterReturning(){
      		System.out.println("后置通知")
      	}
      	@After("anyMethod()") //添加最终通知,需要将切入点的名称填入
      	public void doAfter(){
      		System.out.println("最终通知")
      	}
      	@AfterThrowing("anyMethod()") //添加例外通知,需要将切入点的名称填入
      	public void doAfterThrowing(){
      		System.out.println("例外通知")
      	}
    
      	@Around("anyMethod()") 
      	//添加环绕通知,需要将切入点的名称填入
      	//注意1:环绕通知的方式格式是固定的,除了方法名和参数名可以自定义外,其他为固定格式
      	//注意2:在环绕通知方法中必须执行Object result = pjp.proceed();
      	public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
      		System.out.println("环绕通知")
      		Object result = pjp.proceed();
      		return result;
      	}
      }
    

输入图片说明

  • 3、将上述切面类MyInterceptor纳入Spring容器中进行管理,在Spring的xml配置文件中添加bean标签:

      <beans……>
      	<aop:aspectj-autoproxy/>
      	<bean id="myInterceptor" class="com.abinge.aop.MyInterceptor"/>
      	<bean id="personServiceBean" class="com.abinge.aop.PersonServiceBean"/>
      </beans>
    

注解时的细节处理: 1. 当需要获取拦截方法传入的参数时,可以如下表示:

		@Before("anyMethod() && args(name)") 
		public void doAccessCheck(String name){
			System.out.println("前置通知")
		}
		//这样就可以获取被拦截方法传入的字符串参数的值了
		//但是只会拦截com.abinge.aop.PersonServiceBean类中参数为一个字符串类型方法,其他的方法不会拦截
2. 当需要获取被拦截方法执行后的返回值时,可以如下表示:

		@AfterReturning(pointcut="anyMethod()",returnint="result") //添加后置通知,需要将切入点的名称填入
		public void doAfterReturning(String result){
			System.out.println("后置通知")
		}
		//这样就可以通过参数result获取被拦截对象执行后的返回值
		//但是只会拦截com.abinge.aop.PersonServiceBean类中返回值为字符串类型的方法,其他的方法不会拦截
3. 当需要获取被拦截方法执行后的返回值时,可以如下表示:

		@AfterThrowing(pointcut="anyMethod()",throwing="e") //添加例外通知,需要将切入点的名称填入
		public void doAfterThrowing(Exception e){
			System.out.println("例外通知")
		}
		//这样就可以通过参数e获取被拦截对象执行中的异常

转载于:https://my.oschina.net/abinge/blog/683595

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值