您现在的位置是:首页 >技术教程 >spring 注解详解和注解的简写网站首页技术教程

spring 注解详解和注解的简写

redlevin 2024-06-14 17:19:17
简介spring 注解详解和注解的简写

至于最常见的 execution表达式;由于网上一搜基本都是用的这个,这里就不在赘述了;这里将我知道的分享给大家;

//@Around("@annotation(自定义注解)")//自定义注解标注在方法上的方法执行aop方法
如:@Around("@annotation(org.springframework.transaction.annotation.Transactional)")

//@Around("@within(自定义注解)")//自定义注解标注在的类上;该类的所有方法(不包含子类方法)执行aop方法
如:@Around("@within(org.springframework.transaction.annotation.Transactional)")

//@Around("within(包名前缀.*)")//com.aop.within包下所有类的所有的方法都会执行(不包含子包) aop方法
如:@Around("within(com.aop.test.*)")

//@Around("within(包名前缀..*)")//com.aop.within包下所有的方法都会执行(包含子包)aop 方法
如:@Around("within(com.aop.test..*)")

//@Around("this(java类或接口)")//实现了该接口的类、继承该类、该类本身的类---的所有方法(包括不是接口定义的方法,但不包含父类的方法)都会执行aop方法
如:@Around("this(com.aop.service.TestService)")

//@Around("target(java类或接口)")//实现了该接口的类、继承该类、该类本身的类---的所有方法(包括不是接口定义的方法,包含父类的方法)
如:@Around("this(com.aop.service.TestService)")

//@Around("@target(自定义注解)")//springboot项目启动报如下错误,没有解决
// Caused by: java.lang.IllegalStateException:
// StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[] failed to start
目前分享到这里了!
————————————————
版权声明:本文为CSDN博主「scos_sxb」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/scos_sxb/article/details/100945389

在自定义个注解之后,通过这个注解,标注需要切入的方法,同时把需要的参数传到切面去。那么我们怎么在切面使用这个注解。
我们使用这个自定义注解一方面是为了传一些参数,另一方面也是为了省事。
具体怎么省事,看我下面的例子就造啦。
一般,别人的切面都是这么写的
先声明一个切入点。
    //切入点签名
    @Pointcut("execution(* com.lxk.spring.aop.annotation.PersonDaoImpl.*(..))")
    private void aa() {
    }
切入点声明OK之后,就是在不同的 advice 里面使用啦。一般都是如下使用。
下面的 暂时是不带注解的
//前置通知
@Before("aa()")
 
//后置通知
@AfterReturning(value = "aa()", returning = "val")
public void afterMethod(JoinPoint joinPoint, Object val) {}
 
//最终通知
@After("aa()")
 
//环绕通知
@Around("aa()")
 
//异常通知
@AfterThrowing(value = "aa()", throwing = "ex")
public void throwingMethod(Throwable ex) {}
这些切面方法里面的参数。JoinPoint joinPoint,这个是哪个都可以加的。加不加随意。需要的话就加。是可以用的。

要是带个咱自定义的注解呢?
我又看到很多人都是如下写的。
我就不全部带上了,就以这个after为例,看看是如何写的吧
@After(value = "aa() && @annotation(methodLog)", argNames = "joinPoint, methodLog")
public void methodAfter(JoinPoint joinPoint, MethodLog methodLog) throws Throwable {}
按照上面这写,没毛病,因为别人都是这么写的,我也确实验证啦,这个能拿到咱定义的注解,以及注解上的参数。

还有个写法,就是不用显示的声明切入点,就是那个@Pointcut 

先说下这个显示声明的好处,就像声明变量一样,因为这个切入点表达式是可以用 &&  ||   !来组合条件的,这么声明的话,可以使得代码简洁。
直接在各类 advice 通知的参数上面,使用execution来声明。
例如:
@Around(value = "(execution(* com.lxk.service..*(..))) && @annotation(methodLog)", argNames = "joinPoint, methodLog")
public Object methodAround(ProceedingJoinPoint joinPoint, MethodLog methodLog) throws Throwable {}
其实,上面的value里面的意思,就是复合那个切入的点的条件, 以&&连接,也就是说2个都符合。
既然咱自定义了注解,就是来干这个切面的,为啥还要对他是哪个包,要限制一下呢,我就把前面的给删除啦。
最终简化如下:
@Around(value = "@annotation(methodLog)")
public Object methodAround(ProceedingJoinPoint joinPoint, MethodLog methodLog) throws Throwable {}
代码依然正常运行。

既然不用加那个包的限制,这切面还是OK的,为啥还要加呢?

我稍微考虑下,估计是这么个原因:

自定义注解命名的时候,可能你取的名字很大众化,其他的jar包,也就是你项目引入的jar包,可能有重名的注解,如果要是不加包限制的话,那估计就会出现意想不到的效果。所以,我们就看到,那么多的切面代码,这地方的写法都是千篇一律 都是使用 && 符号。限制包,然后限制使用的是哪个注解。


————————————————
版权声明:本文为CSDN博主「请叫我大师兄_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_27093465/article/details/78804793

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。