Spring框架--AOP学习---利用XML配置实现

各个文件放置的位置

业务实现类:被代理类

public class CalFabImpl implements ICalFab {
	@Override
	public int calFabByLoop(int n) {
		int n1 = 1;
		int n2 = 1;
		int n3 = 0;
		for(int i = 3;i<=n;i++){
			n3 = n1 + n2;
			n1 = n2 ;
			n2 = n3;
		}
		return n3;
	}
	@Override
	public int calFabByRecursion(int n) {
		if(n == 1 || n == 2) return 1;
		return calFabByRecursion(n-1)+calFabByRecursion(n-2);
	}
	@Override
	public void test() {
		System.out.println("12222");
		
	}
}

业务接口:代理接口

public interface ICalFab {
	int calFabByLoop(int n);
	int calFabByRecursion(int n);
	void test();
}

自定义功能性切面,利用XML配置实现

public class SelfAspect {
	
	//--通知:Before类型的Advice
	public void testBefore(){
		System.out.println("Before do something...");
	}
	
	//--通知:After类型的Advice
	public void testAfter(){
		System.out.println("After do something...");
	}
	
	//--通知: Around类型的Adcive   ProceedingJoinPoint:连接通知和方法的执行点
	public int testAround(ProceedingJoinPoint jp){
		int result = 0;
		try {
			long start = System.currentTimeMillis();
			result = (int)jp.proceed();   //--执行真正的业务方法
			long end = System.currentTimeMillis();
			System.out.println((end-start)+"ms");
		} catch (Throwable e) {
			e.printStackTrace();
		}  
		return result;
	}
}

Invoker类 调用

public class Invoker {
	public static void main(String[] args) {
		//--1.获取Spring容器
		ApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");
		
		//--2.获取业务Bean
		ICalFab calFab =(ICalFab) ctx.getBean("calFab");
		
		//--3.调用业务方法
		System.out.println(calFab.calFabByLoop(40));
		System.out.println(calFab.calFabByRecursion(40));
		
		System.out.println(calFab.getClass().getName());
		System.out.println(calFab instanceof ICalFab);
		//calFab.test();
		
	}
}

XML配置文件

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
    <!-- Sprng IOC -->
   <bean id="calFab" class="day10_29.AOP.CalFabImpl"></bean>
   <bean id="slefAspectRef" class="day10_29.AOP.SelfAspect"></bean>
   
   <!-- 利用Spring的AOP功能配置切面 -->
   <aop:config>
        <!-- 切面 -->
   		<aop:aspect ref="slefAspectRef">
   			<!-- 切点  在CalFabImpl类的任何方法上加通知-->
   			<aop:pointcut expression="execution(* day10_29.AOP.CalFabImpl.*(..))" id="selfPointcut"/>	
   			<!-- 通知 -->
   			<aop:before method="testBefore" pointcut-ref="selfPointcut"/>
   			<aop:after method="testAfter" pointcut-ref="selfPointcut"/>
   			<aop:around method="testAround" pointcut-ref="selfPointcut"/>
   		</aop:aspect>
   </aop:config>
</beans>

AOP的术语

  • 1)Advice 通知
  •  用于表示自定义的功能在什么时候执行,具体的通知分类
    
  •  Before:在目标方法执行之前
    
  •  After:在目标方法执行之后
    
  •  After-Returning:在目标方法返回并且执行成功之后之前
    
  •  After-throwing:某个目标方法抛出异常后,就执行该方法
    
  •  Around:在目标方法执行之前或之后执行
    
  • 2)Pointcut 切点
  •   表示要在哪个目标方法上执行相应的功能(也就是执行通知)
    
  • 3)Aspect 切面
  •   切面的本质就是   。是通知和切点的集合,定义了在哪些方法上什么时候执行什么样的功能
    
发布了26 篇原创文章 · 获赞 9 · 访问量 286

猜你喜欢

转载自blog.csdn.net/weixin_45430616/article/details/102821029