spring aop 切点和切面,spring的切面编程
1.AOP概念是面向对象编程,指的是通过扩展功能,在不修改源代码的情况下,将功能代码与业务逻辑代码分离。
主要功能:日志记录、性能统计、安全控制、事务处理、异常处理等。
主要用途:分离日志记录、性能统计、安全控制、事务处理、异常处理等代码。来自业务逻辑代码。通过分离这些行为,我们希望它们可以独立于不引导业务逻辑的方法,这样改变这些行为就不会影响业务逻辑代码。
AOP的特点:采用水平抽取机制代替传统垂直继承系统的重复代码。
Aop代表面向方面编程,它是面向方面的。AOP的主要目的是提取业务处理中的刻面,面向处理过程中的某个步骤或阶段,以获得逻辑流程中各部分之间低耦合的隔离效果。类似于设计模式完成的任务,它提供了另一个角度来思考程序的结构,以弥补面向对象编程的不足。
一般来说,它提供了一种将方面注入业务实现的机制。这样,在业务操作过程中,定义的刻面通过切入点绑定到业务上,从而实现一些特殊逻辑对业务的绑定。
比如,如果你需要一个日志函数,你首先想到的就是通过log4j或者方法中的其他框架进行日志记录。然而,当你写下来的时候,你发现了一个问题。其实整个业务中核心业务代码并不多,都是日志或者其他辅助代码。而且,很多业务需要相同的功能,比如日志。这时,这些日志记录功能需要再次复制。即使它们被封装到一个框架中,也需要被调用。在这里使用复杂的设计模式是不值得的。所以你需要面对截面。
2.aop的名称。首先介绍一些aop术语。其实这些术语对AOP的使用没有什么影响,但是最好了解一些,以便更好的理解。
方面:可能跨越多个对象的关注点的模块化。事务管理是J2EE应用程序中横切关注点的一个好例子。在Spring AOP中,可以使用基于模式或@Aspect注释来实现方面。连接点:程序执行过程中的一个特定点,例如当调用一个方法或处理一个异常时。在Spring AOP中,连接点总是代表一个方法的执行。建议:在切面的特定连接点执行的动作。它包括不同类型的通知,如“周围”、“之前”和“之后”(通知的类型将在后面讨论)。许多AOP框架(包括Spring)使用拦截器作为通知模型,并维护以连接点为中心的拦截器链。切入点:匹配连接点的断言。通知与一个切入点表达式相关联,并在满足这个切入点的连接点上运行(例如,当一个具有特定名称的方法被执行时)。切入点表达式如何匹配切入点是AOP的核心:Spring默认使用AspectJ切入点语法。简介:它用于声明一个类型的附加方法或属性(也称为类型间声明)。Spring允许向任何被代理的对象引入新的接口(和相应的实现)。例如,您可以使用import使bean实现IsModified接口,从而简化缓存机制。目标对象:由一个或多个方面通知的对象。也称为建议对象。因为Spring AOP是通过运行时代理实现的,所以这个对象总是被代理的对象。AOP代理:由AOP框架创建的对象,用于实现正切契约(如通知方法的执行等。).在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。编织:将切面连接到其他应用程序类型或对象,并创建一个通知对象。这些可以在编译时(例如,使用AspectJ编译器)、类加载时和运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成编织。其中,重要名词有:插队,插队
3.AOP的底层由动态代理实现,包括两种方式:
(1)使用JDK动态代理。
(2)用cglib实现。
JDK动态代理的实现;
只能为实现接口的类生成代理,而不能为类生成代理,目标类型实现的所有接口都将被代理。原理是在运行时创建接口的实现类,完成目标对象的代理。步骤如下:
定义实现接口的InnvocationHandler的类被注入到代理类中,通过构造函数实现invoke(Object proxy,Method method,Object[] args)方法。代理类的类加载器在main函数中获得。使用Proxy.newProxyInstance()生成代理对象,通过代理对象调用各种方法cglib。动态代理实现:
对于类实现代理是否实现接口没有要求。原理是生成指定类的子类,覆盖其中的方法。因为是继承,所以最好不要将代理的类或方法声明为最终类型。
定义一个实现MethodIntercepter接口的类来实现它的Intercepter()方法,其中调用proxy.invokeSuper()来选择代理模式:
如果目标对象实现接口,默认使用JDK的动态代理实现AOP,也可以强制cgLib实现AOP。如果目标对象没有实现接口,就必须使用cglib库,Spring会自动在JDK动态代理和cglib之间转换静态代理和动态代理的区别:
静态代理:自己编写创建代理类,然后编译。在程序运行之前,动态代理已经存在于。代理类的类文件:在实现阶段,你不需要关心代理是谁,但是在运行阶段(通过反射机制),你可以指定代理哪个对象。4.例1。pom引入Springboot来使用AOP相关的依赖。
其中包括:
Cglib包用于动态代理,基于类的代理;
aspectjrt和aspectjweaver是与实现相关的包,用来支持切面编程的;
aspectjrt包是实现的运行时间包;
aspectjweaver是实现的织入包;
2、实现一个简单的网请求入口(实现传入名字参数,返回"你好xxx”的功能)
注意:在完成了引入面向切面编程依赖包后,一般来说并不需要去做其他配置。使用过春天注解配置方式的人会问是否需要在程序主类中增加@EnableAspectJAutoProxy来启用,实际并不需要。
因为在面向切面编程的默认配置属性中,spring.aop.auto属性默认是开启的,也就是说只要引入了面向切面编程依赖后,默认已经增加了@EnableAspectJAutoProxy。
3、定义切面类,实现网层的日志切面
要想把一个类变成切面类,需要两步,
在类上使用@组件注解把切面类加入到国际奥林匹克委员会容器中
在类上使用@Aspect注解使之成为切面类
包com。举例。AOP
导入org。AspectJ。郎。连接点;
导入org。AspectJ。郎。注释。回来后;
导入org。AspectJ。郎。注释。方面;
导入org。AspectJ。郎。注释。之前;
导入org。AspectJ。郎。注释。切入点;
导入org。slf4j。记录者;
导入org。SLF 4j。伐木工厂;
导入org。spring框架。刻板印象。组件;
导入组织。spring框架。网络。语境。请求。requestcontextholder
导入组织。spring框架。网络。语境。请求。servletrequestattributes
导入javax。servlet。http。http servlet请求;
导入Java。util。数组;
@Aspect
@组件
公共类WebLogAcpect {
私有记录器记录器=记录器工厂。获取日志记录器(weblogacpect。类);
/**
* 定义切入点,切入点为com.example.aop下的所有函数
*/
@切入点(执行(public * com.example.aop.*.*(.)))
公共空的日志(){}
/**
* 前置通知:在连接点之前执行的通知
* @param连接点
* @次投掷可投掷的
*/
@Before(webLog())
public void doBefore(连接点连接点)Throwable {
//接收到请求,记录请求内容
ServletRequestAttributes attributes=(ServletRequestAttributes)requestcontextholder。getrequestattributes();
http servlet请求请求=属性。get request();
//记录下请求内容
伐木工。信息( URL:请求。getrequesturl().toString());
伐木工。info( HTTP _ METHOD:请求。get方法());
伐木工。信息( IP:请求。get remote addr());
伐木工。info( CLASS _ METHOD:连接点。获取签名().getDeclaringTypeName()"。joinPoint.getSignature().getName());
伐木工。info( ARGS:数组。tostring(连接点。get args()));
}
@AfterReturning(returning=ret ,pointcut=webLog())
public void doAfterReturning(Object ret)throws Throwable {
//处理完请求,返回内容
logger.info(RESPONSE : ret ).
}
}以上的切面类通过@切入点定义的切入点为com.example.aop包下的所有函数做切人,通过@以前实现切入点的前置通知,通过@AfterReturning记录请求返回的对象。
访问http://本地主机:8004/你好?name=lmb得到控制台输出如下:
参考文章:社区云-社区文章详情
【弹簧靴】春季面向切面编程(Aspect Oriented Programming的缩写)面向切面编程初接触-大招无限
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。