Spring核心技术:AOP面向切面,前置增强和后置增强

Spring核心技术:AOP面向切面

所谓的面向切面编程,是一种通过预编译和运行期动态代理的方式,实现在不修改源代码的情况下给程序动态添加功能的技术。
面向对象的延续,Spring框架的重要内容,是函数式编程的一种衍生泛型。
利用AOP可以对业务逻辑各部分之间耦合度降低,提高程序的重用性,提高开发效率。

AOP的原理:(1)将复杂的需求分解出不同的方面,将散布在系统中的公共功能集中解决。
		  (2)采用代理机制组装起来运行,在不改变原程序的基础上对代码段进行增强处理,增加新的功能。
		  
AOP相关术语:
通知(advice):增强的方法,通知就是在切面的某个连接点上执行的操作,也就是事务管理,日志管理,权限管理等;
切入点(PointCut):已经被增强的链接点,切入点就是描述某一类选定的连接点,也就是指定某一类要织入通知的方法。
连接点(Joinpoint):指哪些方法可能被增强,程序执行时的某个特定的点,在Spring中就是一个方法的执行。
切面(Aspect):是切入点PointCut和通知advice的一个结合,切面就是一个关注点的模块化,如事务管理,日志管理,权限管理等。
目标对象(target):需要被代理的类(Service),一般指的是业务层的类,就是被AOP动态代理的目标对象。
AOP代理(proxy):代理类
织入(Weaving):是指把增强advice应用到目标对象target中来创建新的代理对象proxy的过程。

面向切面编程:从系统中分离出切面,独立于业务逻辑(service)实现,在程序“执行时”织入程序中运行(在什么位置,执行什么功能)
配置AOP主要使用aop命名空间下的元素完成,可以实现定义切入点和织入增强等操作

Spring核心技术:AOP面向切面,前置增强和后置增强_第1张图片

实现方式

(1)导入命名空间





(2)将增强类转换为Bean的增强类

public class UserServiceLogger {
    private static Logger log = Logger.getLogger(UserServiceLogger.class);
    //前置增强 JoinPoint:目标方法的类名  方法名 参数列表...
    public void before(JoinPoint jp) {
        log.info("调用 " + jp.getTarget() + " 的 " + jp.getSignature().
                getName() + " 方法。方法入参:" + Arrays.toString(jp.getArgs()));
    }

    //后置增强 JoinPoint:目标方法的类名   方法名 参数列表...
    //result 获取目标 方法的返回值
    public void afterReturning(JoinPoint jp, Object result) {
        log.info("调用 " + jp.getTarget() + " 的 " + jp.getSignature().
                getName() + " 方法。方法返回值:" + result);
    }
}

增强类




(3)配制文件:Application.xml




    
    
   
    

    
    
        
        
        
        
        
            
            
                
                
                
                

                
                
                
                
                
            
    


Spring核心技术:AOP面向切面,前置增强和后置增强_第2张图片

测试类

public class TestUser {
    @Test
    public void testUser(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
        /*转换为 接口 接口 接口 UserService*/
        UserService userService = (UserService) applicationContext.getBean("userService");

        int row = userService.addUser(new User("admin", "张三", "123456"));
        System.out.println(row==1?"成功":"失败");
    }
}

Spring核心技术:AOP面向切面,前置增强和后置增强_第3张图片

你可能感兴趣的:(Spring,spring,AOP面向切面,前置增强,后置增强)