• Spring学习笔记之AOP



    title: Spring学习笔记之AOP
    date: 2017-08-29 14:17:55
    tags: Spring

    AOP(Aspect-Oriented Programming)面向切面编程,只是一种编程规范,为完善 OOP 编程并补充其不足。
    通俗讲就是为了把经常使用的模块(方法)抽取出来,组合成类,并在需要用到这些模块的地方将其插入。

    几个术语

    1. 横切关注点:从每个方法中抽取出来的同一类非核心业务
    2. 切面:封装「横切关注点」的类
    3. 通知:横切关注点具体在切面中的具体实现
    4. 连接点:要用到切面的方法
    5. AOP代理:AOP框架使用代理模式创建的对象,从而实现在连接点处插入通知(即应用切面),就是通过代理来对目标对象应用切面
    6. 目标类:要用到切面的类,也就是连接点的集合

    「通知」类型:

    1. @Before:前置通知,在方法执行之前执行
    2. @After:后置通知,在方法执行之后执行
    3. @AfterRunning:返回通知,在方法返回结果之后执行
    4. @AfterThrowing:异常通知,在方法抛出异常之后执行
    5. @Around:环绕通知,围绕着方法执行

    基于注解实现的AOP

    1. 导包

    com.springsource.net.sf.cglib -2.2.0.jar
    com.springsource.org.aopalliance-1.0.0 .jar
    com.springsource.org.aspectj.weaver-1.6.8 .RELEASE.jar
    commons-logging-1.1.3. jar
    spring-aop-4.0.0.RELEASE.jar
    spring-aspects-4.0.0.RELEASE.jar
    spring-beans-4.0.0.RELEASE.jar
    spring-context-4.0.0.RELEASE.jar
    spring-core-4.0.0.RELEASE.jar
    spring-expression-4.0.0.RELEASE. jar

    2. 在 applicationContext.xml 中配置,开启基于注解的 AOP 功能同时配置包扫描

    <context:component-scan base-package=“com.zst.testAOP”></context:component-scan>
    aop:aspectj-autoproxy</aop:aspectj-autoproxy>

    3. 定义一个切面类,并把这个切面类加入到IOC容器中

    @Aspect//表示这是一个切面类
    @Component//加入IOC容器

    4. 在切面类中声明通知方法

    /*----AOPtosimpleCalculateClass-----*/
    package com.zst.testAOP;
    
    import java.util.Arrays;
    import java.util.List;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.Signature;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.springframework.stereotype.Component;
    //环绕通知
    @Aspect
    @Component
    public class AOPtosimpleCalculateClass {
    
    	 @Around(value="execution(public *	 com.zst.testAOP.simpleCalculateImp.*(..) )")
    	public Object theAround(ProceedingJoinPoint point) {
    		Object[] args = point.getArgs();// 获取方法的形参列表
    		List<Object> asList = Arrays.asList(args);
    
    		Signature signature = point.getSignature();// 获取此方法的签名
    		String sigName = signature.getName();
    		System.out.println("signature=" + signature);
    		System.out.println("signature.getName()=" + sigName);
    		Object obj = null;
    		try {
    			try {
    				System.out.println("相当于 @Before  ");
    				obj = point.proceed();// 执行此方法
    			} finally {
    				System.out.println("相当于 @After  ");
    			}
    			System.out.println("相当于 @AfterRunning ");
    		} catch (Throwable e) {
    			//此处相当于 @AfterThrowing
    			System.out.println("有异常");
    			e.printStackTrace();
    		} 
    		return obj;
    	}
    }
    
    
    /*----AOPTwo-----*/
    package com.zst.testAOP;
    
    import java.util.Arrays;
    import java.util.List;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.AfterThrowing;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    import org.springframework.stereotype.Component;
    
    @Aspect
    @Component
    public class AOPTwo {
    	
    	@Pointcut(value="execution(public * com.zst.testAOP.simpleCalculateImp.*(..)  )")
    	public void setIT(){
    		
    	}
    	
    	@Before(value="setIT()")
    	public void before(JoinPoint point){//org.aspectj.lang.JoinPoint
    		System.out.println("第二个配置的切面类————@Before开始");
    		Object[] args = point.getArgs();
    		List<Object> asList = Arrays.asList(args);
    		System.out.println(asList);
    		System.out.println("第二个配置的切面类————@Before结束");
    	}
    	
    	@After(value="setIT()")
    	public void after(){
    		System.out.println("第二个配置的切面类————@After");
    	}
    	
    	@AfterReturning(value="setIT()" ,returning="theReturn")
    	public void afterReturnning(Object theReturn){
    		System.out.println("第二个配置的切面类————@AfterReturning开始");
    		System.out.println("获得的参数是"+theReturn);
    		System.out.println("第二个配置的切面类————@AfterReturning结束");
    	}
    	
    	@AfterThrowing(value="setIT()" ,throwing="ex")
    	public void catchThrow(Exception ex){
    		System.out.println("第二个配置的切面类————@AfterThrowing开始");
    		System.out.println(ex);
    		System.out.println("第二个配置的切面类————@AfterThrowing结束");
    		
    	}
    }
    
    
    /*测试方法*/
    	public void tett(){
    		ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
    		simpleCalculate bean = app.getBean("theCalculateBean",simpleCalculate.class);
    		bean.div(23,6);
    		//正常:@Before、@After、@AfterReturning
    		//异常:@Before、@After、@AfterThrowing
    	}
    
  • 相关阅读:
    【转载】八大排序算法
    【转载】算法的时间复杂度和空间复杂度的计算
    【转载】SpringMVC前台给后台传值的方式
    Session方法
    配置《算法 第四版》的Eclipse开发环境
    Learning Scrapy笔记(三)- Scrapy基础
    Learning Scrapy笔记(七)- Scrapy根据Excel文件运行多个爬虫
    Learning Scrapy笔记(六)- Scrapy处理JSON API和AJAX页面
    Scrapy Learning笔记(四)- Scrapy双向爬取
    Learning Scrapy笔记(五)- Scrapy登录网站
  • 原文地址:https://www.cnblogs.com/Zhoust/p/14994609.html
Copyright © 2020-2023  润新知