百科狗-知识改变命运!
--

什么是AOP,AOP的作用是什么 ?

乐乐1年前 (2023-12-22)阅读数 7#综合百科
文章标签通知方法

AOP :面向切面编程 ,它主要关注的是程序的执行过程。具体解析:在java方法调用时,AOP机制能自动进行方法拦截,允许在方法调用之前,调用后,以及执行异常时添加特点的代码来完成需要的功能。特点:1,消除编码模块之间的耦合。 2, 可以在任意阶段,向已有功能模块中填加新功能,且不侵入原有功能 低侵入式设计 3, 各步骤之间的良好隔离性 , 源代码的无关性

原理

AOP(Aspect Oriented Programming),也就是面向方面编程的技术。AOP基于IoC基础,是对OOP的有益补充。

AOP将应用系统分为两部分,核心业务逻辑(Core business concerns)及横向的通用逻辑,也就是所谓的方面Crosscutting enterprise concerns,例如,所有大中型应用都要涉及到的持久化管理(Persistent)、事务管理(Transaction Management)、安全管理(Security)、日志管理(Logging)和调试管理(Debugging)等。

AOP正在成为软件开发的下一个光环。使用AOP,你可以将处理aspect的代码注入主程序,通常主程序的主要目的并不在于处理这些aspect。AOP可以防止代码混乱。

Spring framework是很有前途的AOP技术。作为一种非侵略性的、轻型的AOP framework,你无需使用预编译器或其他的元标签,便可以在Java程序中使用它。这意味着开发团队里只需一人要对付AOP framework,其他人还是像往常一样编程。

 让我们从定义一些重要的AOP概念开始。

— 方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的Advisor或拦截器实现。

— 连接点(Joinpoint):程序执行过程中明确的点,如方法的调用或特定的异常被抛出。

— 通知(Advice):在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around”、“before”和“throws”通知。通知类型将在下面讨论。许多AOP框架包括Spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器链。

— 切入点(Pointcut):指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点,例如,使用正则表达式。

— 引入(Introduction):添加方法或字段到被通知的类。Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现IsModified接口,来简化缓存。

— 目标对象(Target Object):包含连接点的对象,也被称作被通知或被代理对象。

— AOP代理(AOP Proxy):AOP框架创建的对象,包含通知。在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。

— 编织(Weaving):组装方面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。

?拦截器(也称拦截机)

拦截机 (Interceptor), 是 AOP (Aspect-Oriented?Programming) 的另一种叫法。AOP本身是一门语言,只不过我们使用的是基于JAVA的集成到Spring 中的 SpringAOP。同样,我们将通过我们的例子来理解陌生的概念。

Java代码

package?com.test.TestSpring3;?

public?interface?UserService?//?被拦截的接口?

...{?

public?void?printUser(String?user);?

}?

?

实现类

Java代码

package?com.test.TestSpring3;?

public?class?UserServiceImp?implements?UserService?//?实现UserService接口?

...{?

public?void?printUser(String?user)?...{?

System.out.println("printUser?user:"?+?user);//?显示user?

}?

}?

?

AOP拦截器

Java代码

package?com.test.TestSpring3;?

import?org.aopalliance.intercept.MethodInterceptor;?

import?org.aopalliance.intercept.MethodInvocation;?

public?class?UserInterceptor?implements?MethodInterceptor?

//?AOP方法拦截器?

...{?

public?Object?invoke(MethodInvocation?arg0)?throws?Throwable?...{?

try?...{?

if?(arg0.getMethod().getName().equals("printUser"))?

//?拦截方法是否是UserService接口的printUser方法?

...{?

Object[]?args?=?arg0.getArguments();//?被拦截的参数?

System.out.println("user:"?+?args[0]);?

arg0.getArguments()[0]?=?"hello!";//?修改被拦截的参数?

}?

System.out.println(arg0.getMethod().getName()?+?"---!");?

return?arg0.proceed();//?运行UserService接口的printUser方法?

}?catch?(Exception?e)?...{?

throw?e;?

}?

}?

}?

?

?

测试类

Java代码

package?com.test.TestSpring3;?

import?org.springframework.beans.factory.BeanFactory;?

import?org.springframework.beans.factory.xml.XmlBeanFactory;?

import?org.springframework.context.ApplicationContext;?

import?org.springframework.context.support.ClassPathXmlApplicationContext;?

import?org.springframework.context.support.FileSystemXmlApplicationContext;?

什么是AOP,AOP的作用是什么 ?

import?org.springframework.core.io.ClassPathResource;?

import?org.springframework.core.io.Resource;?

import?org.springframework.web.context.support.WebApplicationContextUtils;?

public?class?TestInterceptor?...{?

public?static?void?main(String[]?args)?...{?

ApplicationContext?ctx?=?new?FileSystemXmlApplicationContext(?

"classpath:applicationContext.xml");?

//ApplicationContext?ctx?=?new?ClassPathXmlApplicationContext("applicationContext.xml");?

UserService?us?=?(UserService)?ctx.getBean("userService");?

us.printUser("shawn");?

}?

}?

?

配置文件

Xml代码

?

?

?

?

?

?

?

?

com.test.TestSpring3.UserService?

?

?

?

?

?

?

?

userInterceptor?

?

?

?

?

?

输出:

user:shawn

printUser---!

printUser?user:hello!?

结论:调用方法的时候?传入的值被拦截修改了.

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)