栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

AOP实现的三种方式

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

AOP实现的三种方式

AOP实现的三种方式

说说为什么要使用AOP编程:
AOP(面向切面编程)是OOP(面向对象编程)发展而来,在OOP编程中,每一个对象都有自己特定的功能,但是如果我们需要引入公共的功能时候,那么如果继续使用OOP编程思想的话,就会导致大量代码重用,而不利于模块的重用。而AOP编程则是将一些公共业务封装起来,为每一个需要使用这些公共业务的对象提供相应业务(通过代理实现)。一般将公共业务封装起来的类就是切面类,也就是我们切面编程所说的切面。

下面我们给对象添加一个公共业务:日志输出。
即在方法执行前后都在控制台输出一句话。
通过这个案例,简单介绍下AOP实现的三种方式。

先给出一个测试类代码:

接口类:

public interface UserService {
    public void add();
    public void delete();
    public void update();
    public void select();

}

实现类:

public class UserServiceImpl implements UserService{

    public void add() {
        System.out.println("增加了一个用户");
    }

    public void delete() {
     System.out.println("删除了一个用户"); }

    public void update() {
        System.out.println("更新了一个用户");
    }

    public void select() {
        System.out.println("查询了一个用户");
    }
}

AOP实现的三种方式:
1、使用Spring API原生接口

方法执行后输出日志:

import org.springframework.aop.AfterReturningAdvice;

import java.lang.reflect.Method;

public class AfterLog implements AfterReturningAdvice {
    public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
        System.out.println("Spring API接口实现AOP,add方法执行后");
    }
}

方法执行前输出日志:

import org.springframework.aop.MethodBeforeAdvice;

import java.lang.reflect.Method;

public class Log implements MethodBeforeAdvice {
    public void before(Method method, Object[] objects, Object o) throws Throwable {
        System.out.println("Spring API接口实现AOP,add方法执行前");
    }
}

xml配置文件:

    
    
    

    
    
        
            
            
            
            
            
        

2、自定义切面类 ,即切面自定义

自定义切面类,且封装公共业务(这里是日志功能)

public class DiyPointCut {
    public void before(){
        System.out.println("使用自定义类实现AOP,delete方法执行前");
    }

    public void after(){
        System.out.println("使用自定义类实现AOP,delete方法执行后");
    }
}

xml配置文件:

    

    
        
        
            
            
            
            
            
        
    

3、通过注解实现:

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

//注解实现Aop
@Aspect //标注这个类是切面类
public class AnnotationPointCut {
    @Before("execution(* com.zm.service.UserServiceImpl.update(..))")
    public void before(){
        System.out.println("使用注解实现AOP,update方法执行前");
    }

    @After("execution(* com.zm.service.UserServiceImpl.update(..))")
    public void after(){
        System.out.println("使用注解实现AOP,update方法执行后");
    }
}

xml配置:

    
    
    

来测试一下结果:

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //动态代理类实现了userService接口
        //通过userServiceImpl对象反射,动态代理生成对应代理类对象,并转换成UserService接口类型。
        UserService userService =  (UserService) context.getBean("userService");
        userService.add();
        userService.delete();
        userService.update();
    }
}

这里通过三种方式实现AOP编程,这三种方式分别选择了三个不同的方法作为切入点,因此三个方法被执行时,分别会引入三个不同公共业务(这里的公共业务是日志输出)

注意:
很多原理写在注释中了,如果有不清楚的可以多看一下注释,或者直接评论留言,欢迎一起讨论,欢迎纠错!!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/983380.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号