博客
关于我
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/

你可能感兴趣的文章
pcie握手机制_【博文连载】PCIe扫盲——Ack/Nak 机制详解(一)
查看>>
pcm转wav的方法及代码示例
查看>>
PC史上最悲剧的16次失败
查看>>
PC端恶意代码分析Lab1.1-5.1,从零基础到精通,收藏这篇就够了!
查看>>
PC端稳定性测试探索
查看>>
PC端编辑 但能在PC端模拟移动端预览的富文本编辑器
查看>>
PDB文件:每个开发人员都必须知道的
查看>>
springMVC学习(二)
查看>>
Pdfkit页眉和页脚
查看>>
PDF中的Pandoc语法突出显示不起作用
查看>>
pdf从结构新建书签_在PDF文件中怎样创建书签
查看>>
pdf做成翻页电子书_第一弹:常见BOOX电子书阅读器问题解答,这些技能你都会吗?...
查看>>
PDF工具箱-分割提取合并
查看>>
PDF文字识/编辑?这个工具真的很强大!
查看>>
pdf文档出现乱码如何修改
查看>>
pdf根据模板导出
查看>>
PDF调出本来存在的书签面板
查看>>
pdf转图片
查看>>
pdf转图片、提取pdf文本、提取pdf图片
查看>>
springCloud整合RabbitMQ实现消息中间件
查看>>