博客
关于我
Spring (AOP、静态代理、动态代理)
阅读量:258 次
发布时间:2019-03-01

本文共 2872 字,大约阅读时间需要 9 分钟。

Spring AOP技术指南

1. AOP简介

AOP(Aspect Oriented Programming,面向切面编程)是一种软件开发方法,旨在提高开发效率和代码复用性。传统的编程模式通常需要重复编写相同功能的代码,例如性能监视、事务管理、安全检查和缓存处理。AOP通过引入切面(Aspect)来横向抽取这些功能,减少代码冗余。

1.1 AOP的核心概念

  • 切点(Joinpoint):指在委托类中可以被增强的方法。
  • 切入点(Pointcut):指定需要增强的方法。
  • 通知(Advice):增强的代码逻辑。
  • 目标对象(Target):委托类。
  • 织入(Weaving):将增强逻辑应用到目标类。
  • 代理(Proxy):增强后的类的代理类。
  • 切面(Aspect):切点和通知的结合。

1.2 Spring中的AOP实现

Spring提供了强大的AOP支持,主要通过动态代理实现。具体来说:

  • 基于AspectJ的AOP:Spring2.0及以上版本支持AspectJ切点表达式,允许直接在Bean类中定义切面。
  • @AspectJ注解:AspectJ1.5新增的注解技术,通过JDK5注解技术实现切面定义。

1.3 AspectJ切点表达式

AspectJ的切点表达式简洁且灵活,常见表达式包括:

execution(* com.example.service.MyService.myMethod(..))
  • execution:匹配方法调用。
  • *:表示任意访问修饰符(public、protected、private)。
  • com.example.service.MyService:指定包名。
  • myMethod(..):匹配方法名称及参数。

1.4 AOP的增强类型

在Spring中,常见的通知类型包括:

  • @Before:前置通知。
  • @AfterReturning:后置通知,可获取返回值。
  • @Around:环绕通知,可控制方法执行。
  • @AfterThrowing:异常通知。
  • @After:最终通知。

1.5 AOP编程案例

1.5.1 定义切面

@Aspect@Componentpublic class MyAspect {    @Before("execution(* com.example.dao.UserDao.addUser())")    public void beforeAdvice() {        System.out.println("用户添加前置通知");    }}

1.5.2 测试

@RunWith(SpringRunner.class)@ContextConfiguration("classpath:application-context.xml")public class TestUserDao {    @Autowired    private UserDao userDao;    @Test    public void testAdd() {        userDao.addUser();    }}

2. 代理模式

代理模式通过创建代理对象来间接操作目标对象,核心特点是:

  • 不直接操作目标对象。
  • 代理对象与目标对象实现同一接口。

2.1 静态代理

静态代理要求代理类和目标类实现同一接口,代码示例:

public interface WindWomen {    String say();}public class Pan implements WindWomen {    public String say() {        return "晚上十点小河边见......";    }}public class Wang implements WindWomen {    private WindWomen windWomen;    public Wang(WindWomen windWomen) {        this.windWomen = windWomen;    }    public String say() {        System.out.println("她找我让我给你带个话:");        System.out.println(windWomen.say());        System.out.println("记得啊!");        return null;    }}

2.2 动态代理

基于JDK的动态代理适用于接口实现,代码示例:

public class AgentTest {    public static void main(String[] args) {        final Pan pan = new Pan();        WindWomen windWomen = (WindWomen) Proxy.newProxyInstance(            AgentTest.class.getClassLoader(),            Pan.class.getInterfaces(),            new InvocationHandler() {                public Object invoke(Object proxy, Method method, Object[] args)                    throws Throwable {                    System.out.println("她找我让我给你带个话:");                    Object object = method.invoke(pan, args);                    System.out.println("记得啊!");                    return object;                }            }        );        windWomen.say();    }}

2.3 CGLIB动态代理

CGLIB动态代理基于继承,适用于类继承:

public class Wang2 extends Pan {    public String say() {        System.out.println("她找我让我给你带个话:");        System.out.println(super.say());        System.out.println("记得啊!");        return null;    }}

总结

通过以上内容,可以清晰地了解Spring AOP的核心概念、实现方式及其实际应用。无论是静态代理还是动态代理,都能有效提升代码复用性和维护性。

转载地址:http://isft.baihongyu.com/

你可能感兴趣的文章
python | Python中使用@property装饰器
查看>>
python | Python中的functools模块高级应用
查看>>
python | Python中的itertools模块使用技巧
查看>>
python | Python中的事件驱动编程模型
查看>>
python | Python中的内存池与缓存机制
查看>>
python | Python中的弱引用与内存管理
查看>>
python | Python中的类多态:方法重写和动态绑定
查看>>
python | Python作用域链查找机制
查看>>
python | Python俄罗斯方块游戏详解
查看>>
python | Python动态代码执行:exec和compile函数
查看>>
Python读取文件数据进行数据图形化展示
查看>>
python | Python反向迭代:reversed实现机制
查看>>
python | Python开发必知的数据容器用法(建议收藏!)
查看>>
python读取文件夹下文件名称_如何在Python目录中获取文件名列表
查看>>
python | Python文本处理中的相似性识别应用
查看>>
python | Python模块缓存:sys.modules机制
查看>>
python | Python集成学习和随机森林算法
查看>>
python | Python高阶函数与函数式编程
查看>>
python | pytime,一个实用的 时间和日期处理 Python 库!
查看>>
python | pyupgrade,一个有趣的 Python 库!
查看>>