aspectjava的简单介绍
本篇文章给大家谈谈aspectjava,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、使用java语言,如何对一个类中的静态方法做切面编程?
- 2、Spring AOP中@Aspect拦截介绍(一)
- 3、java spring@AspectJ的作用
- 4、java 的aspect关键字是哪个java版本之后才有的?
- 5、Java编程中的AOP和IOC分别是什么呢,什么时候用呢
- 6、Spring AOP中@Aspect拦截介绍(二)
使用java语言,如何对一个类中的静态方法做切面编程?
aop的事务代理机制最重要的放心是确定切入点,面,通知.具体看代码,下面是在spring中配置的我自己写的一个异常处理的aop作用类 ,该配置切入面在于在controller包下的所有类的所有注解为aspect的切面类,通知类型为表示在目标方法之前切入,切入点为controller包下的所有类所有方法.至于楼主所说的静态方法对于事务机制应该没什么区别吧,只要用within方法一样可以的
!-- 定义共同处理组件 --
bean id="loggerBean"
class="org.tedu.cloudnote.aspect.LoggerBean"
/bean
!-- 将loggerBean组件切入到Controller方法上 --
aop:config
!-- 要切入哪个共同处理组件,ref指定共同组件id值 --
aop:aspect ref="loggerBean"
!-- aop:before表示在目标方法之前切入,
method指定方法名;pointcut指定目标组件 --
aop:before method="logController"
pointcut="within(org.tedu.cloudnote.controller..*)"/
/aop:aspect
/aop:config
之后这个bean所定义的 自定义类的代码如下 ,希望楼主给个采纳,如果问友喜欢,也可以给我个赞哦,摸摸大
package org.tedu.cloudnote.aspect;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
//封装共同处理的组件
@Component//扫描,等价于bean定义
@Aspect//等价于aop:aspect ref=""
public class LoggerBean {
//要在Controller.execute开始位置切入
//方法规则:public void 方法名(){...} (前置通知)
@Before("within(org.tedu.cloudnote.controller..*)")
//等价于aop:before method="logController" pointcut=""
public void logController(){
System.out.println("进入Controller组件处理");
}
}
Spring AOP中@Aspect拦截介绍(一)
本章介绍的@Aspect拦截用的非注解方式,而是通过切入点@Pointcut指定要拦截的目录,本章节实现了拦截请求和返参后对其进行修改,类似于过滤器的作用
User.java
AspectTestController.java
TestAspect.java
如果想要学习或者加上该封装结构,可以在笔者的项目笔记目录下寻找“项目返参结构封装”就可以直接复制了,当然也可以自己返回一个String或者Object类型先测试用着
本测试例子中已经把 @Before和@After和@AfterReturning注掉了,只使用的@Around,可以直接用postman调用测试的,测完还可以放开前面三个注解,再把@Around注掉再测就可以了。
无参的那个测试不能用@Around测试,想要用@Around测试需要改一下,@Around("pointCut() args(arg)")改为@Around("pointCut() "),下面的入参和修改参数部分去掉即可
java spring@AspectJ的作用
AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。
AspectJ(也就是AOP)的动机是发现那些使用传统的编程方法无法很好处理的问题。考虑一个要在某些应用中实施安全策略的问题。
安全性是贯穿于系统所有模块间的问题,每个模块都需要应用安全机制才能保证整个系统的安全性,很明显这里的安全策略的实施问题就是一个横切关注点,使用传统的编程解决此问题非常的困难而且容易产生差错,这就正是AOP发挥作用的时候了。
@AspectJ 使用了Java5 的注解,可以将切面声明为普通的Java类。
java 的aspect关键字是哪个java版本之后才有的?
'aspect'关键字是在Java 1.9之后才引入的。它是用来支持AspectJ风格的切面编程(Aspect-Oriented Programming, AOP)的。在Java中,切面编程是一种用于横切关注点的编程方式,比如日志记录、事务管理、权限检查等。切面编程可以帮助开发者将这些关注点从业务逻辑中分离出来,使得代码更清晰、可维护。
Java编程中的AOP和IOC分别是什么呢,什么时候用呢
控制反转(IOC)
(理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”)
1、Ioc—Inversion of Control:即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
2、谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象即由Ioc容器来控制对象的创建。
谁控制谁?当然是IoC 容器控制了对象。
控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
3、为何是反转,哪些方面反转了: 有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象。
为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转。
哪些方面反转了?依赖对象的获取被反转了。
还是不明白没事,下面搞个简单案例来说就懂啦 !!!
例子:当我们在任何一个有实际开发意义的程序项目中,我们会使用很多类来描述他们特有的功能,并且通过类与类之间的相互协作来完成特定的业务逻辑。这个时候,每个类都需要负责管理与自己有交互的类的引用和依赖,代码将会变的异常难以维护和极高的高耦合。而IOC的出现正是用来解决这个问题,我们通过IOC将这些依赖对象的创建、协调工作交给spring容器去处理,每个对象值需要关注其自身的业务逻辑关系就可以了。在这样的角度上来看,获得依赖的对象的方式,进行了反转,变成了由spring容器控制对象如何获取外部资源(包括其他对象和文件资料等)。
总的来说:IOC就是通过在Xml配置文件里依赖注入来解决代码问题。
IOC的注入类型有几种?主要可以划分为三种:构造函数注入、属性注入和接口注入。Spring支持构造函数注入和属性注入
面向切面(AOP)
(面向切面编程,AOP其实只是OOP的补充而已,AOP基本上是通过代理机制实现的。)
我们管切入到指定类指定方法的代码片段称为切面,而切入到哪些类、哪些方法则叫切入点。有了AOP,我们就可以把几个类共有的代码,抽取到一个切片中,等到需要时再切入对象中去,从而改变其原有的行为。
我们都知道 Java 是 OOP-面向对象编程的,它有自己的优势,也有自己的不足。比如说:在我们开发中,都会有一条业务主线(即客户的需求)。而我们要做的就是实现这个主线上的需求。我们在实现这些功能的时候,经常要干一些额外的不可避免的事情,比如事务的管理,日志的记录等,就很繁杂且代码量增多,所以 Spring 提供了另一种角度来思考程序结构,也就是把这一些事情剥离出来,然后适时适地的把它们加入到我们的代码中,比如说 声明式事务管理的时候,我们在 service 层检测到save*、update*这些方法要被调用的时候,我们先进行开启事务什么的,这就是AOP,面向编程的思想。
AOP的术语:
1、通知(Advice):就是你想要的功能,也就是上面说的 安全,事物,日志等。你给先定义好把,然后在想用的地方用一下
2、连接点(JoinPoint):这个更好解释了,就是spring允许你使用通知的地方,那可真就多了,基本每个方法的前,后(两者都有也行),或抛出异常时都可以是连接点,spring只支持方法连接点.其他如aspectJ还可以让你在构造器或属性注入时都行,不过那不是咱关注的,只要记住,和方法有关的前前后后(抛出异常),都是连接点。
3、切入点(Pointcut):上面说的连接点的基础上,来定义切入点,你的一个类里,有15个方法,那就有几十个连接点了对把,但是你并不想在所有方法附近都使用通知(使用叫织入,以后再说),你只想让其中的几个,在调用这几个方法之前,之后或者抛出异常时干点什么,那么就用切点来定义这几个方法,让切点来筛选连接点,选中那几个你想要的方法。
4、切面(Aspect):切面是通知和切入点的结合。现在发现了吧,没连接点什么事情,连接点就是为了让你好理解切点,搞出来的,明白这个概念就行了。通知说明了干什么和什么时候干(什么时候通过方法名中的before,after,around等就能知道),而切入点说明了在哪干(指定到底是哪个方法),这就是一个完整的切面定义。
5、引入(introduction):允许我们向现有的类添加新方法属性。这不就是把切面(也就是新方法属性:通知定义的)用到目标类中吗
6、目标(target):引入中所提到的目标类,也就是要被通知的对象,也就是真正的业务逻辑,他可以在毫不知情的情况下,被咱们织入切面。而自己专注于业务本身的逻辑。
7、代理(proxy):怎么实现整套aop机制的,都是通过代理,这个一会给细说。
8、织入(weaving):把切面应用到目标对象来创建新的代理对象的过程。有3种方式,spring采用的是运行时,为什么是运行时,后面解释。
Spring AOP中@Aspect拦截介绍(二)
本章介绍的@Aspect拦截用的注解方式,对于想要实现多数据源切换,在指定类或方法上只需加上一个注解便可以实现入参出参日志打印的小伙伴,要认真看那一大堆有关Spring AOP支持的AspectJ切入点指示符的注释了。
使用 @Pointcut("@within(com.example.springboot.common.aspectj.LogAspect)") 就是在你想打日志的类上加上自定义注解@LogAspect;
使用 @Pointcut("@annotation(com.example.springboot.common.aspectj.LogAspect)") 就是在你想打日志的方法上加上自定义注解@LogAspect;
其他的指示符大家自行探索其中的奥秘吧,有需要改进的联系我哦!
@LogAspect
Father.java
Child.java
TestController.java
注意:
@within:这个最后实现的效果是吧自定义注解加到类上,本章便是用的这个注解
@annotation这个最后实现的效果是吧自定义注解加到方法上
TestAspect.java
使用postman调用TestController中的两个方法,测试后发现子类继承了父类中的自定义注解@LogAspect。
第二步测试,去掉LogAspect类中的@Inherited注解,重新启动项目测试就会发现子类不再继承父类的自定义注解。
aspectjava的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、aspectjava的信息别忘了在本站进行查找喔。