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

你可能感兴趣的文章
nodejs 创建HTTP服务器详解
查看>>
nodejs 发起 GET 请求示例和 POST 请求示例
查看>>
NodeJS 导入导出模块的方法( 代码演示 )
查看>>
nodejs 开发websocket 笔记
查看>>
nodejs 的 Buffer 详解
查看>>
nodejs 读取xlsx文件内容
查看>>
nodejs 运行CMD命令
查看>>
Nodejs+Express+Mysql实现简单用户管理增删改查
查看>>
nodejs+nginx获取真实ip
查看>>
nodejs-mime类型
查看>>
NodeJs——(11)控制权转移next
查看>>
NodeJS、NPM安装配置步骤(windows版本)
查看>>
NodeJS、NPM安装配置步骤(windows版本)
查看>>
nodejs与javascript中的aes加密
查看>>
nodejs中Express 路由统一设置缓存的小技巧
查看>>
nodejs中express的使用
查看>>
Nodejs中的fs模块的使用
查看>>
NodeJS使用淘宝npm镜像站的各种姿势
查看>>
nodejs包管理工具对比:npm、Yarn、cnpm、npx
查看>>
NodeJs单元测试之 API性能测试
查看>>