AOP各种表达式,自定义注解笔记

AOP各种表达式,aspectj的关系

xml主要用来描述数据;

自定义注解:
1.要指定注解使用的位置。使用源注解@Target, ElementType
2.注解有生命周期。自定义的注解默认只存在源码。 @Retention(RetentionPolicy.RUNTIME)这样写虚拟机执行的时候就会被发掘。
3.获取注解值得示例:
Class clazz = Strudent.getClass();
//判断是否有注解@Entity
if(clazz.isAnnotationPresent(Enity.class)){
//得到注解
Entity entity = (Entity)clazz.getAnnotation(Entity.class);
String value = entity.value();
}

AOP
Aspect Oriented Programming
Aop是什么?
与OOP对比,面向切面,传统的OOP开发中的代码逻辑是自上而下的,而这些过程会产生一些横切性问题,这些横切性的问题和我们的主业务逻辑关系不大,这些横切性问题不会影响到主逻辑实现的,但是会散落到代码的各个部分,难以维护。AOP是处理一些横切性问题,AOP的编程思想就是把这些问题和主业务逻辑分开,达到与主业务逻辑解耦的目的。使代码的重用性和开发效率更高。

aop的应用场景
日志记录,权限验证,效率检查,事务管理,exception

springAop的底层技术
在这里插入图片描述
springAop和AspectJ的关系
Aop是一种概念springAop、AspectJ都是Aop的实现,SpringAop有自己的语法,但是语法复杂,所以SpringAop借助了AspectJ的注解,但是底层实现还是自己的

spring AOP提供两种编程风格
@AspectJ support ------------>利用aspectj的注解Schema-based AOP support ----------->xml aop:config 命名空间
证明:spring,通过源 码分析了,我们可以知道spring底层使用的是JDK或者CGLIB来完成的代理,并且在官网上spring给出了aspectj的文档,和springAOP是不同的

AOP 概念:
1.Aspect 切面
2.连接点
3.切点;连接点的集合
4.通知(位置,内容)

AOP Proxies AOP的代理,默认使用jdk的动态代理;
AspectJ是一个框架,实现了AOP;
Spring 支持@AspectJ 语法;
需要启用;@EnableAspectJAutoProxy

声明一个切面:
@Aspect
public class myAspect{
}
使用的时候,pom文件中,增加aspectj依赖;

/** * 申明Aspect,并且交给spring容器管理 /
@Component
@Aspect
public class UserAspect {
/
* * 申明切入点,匹配UserDao所有方法调用 * execution匹配方法执行连接点 * within:将匹配限制为特定类型中的连接点 * args:参数 * target:目标对象 * this:代理对象 / @Pointcut("execution( com.yao.dao.UserDao.*(…))")
public void pintCut(){ System.out.println(“point cut”); }
/** * 申明before通知,在pintCut切入点前执行 * 通知与切入点表达式相关联, * 并在切入点匹配的方法执行之前、之后或前后运行。 * 切入点表达式可以是对指定切入点的简单引用,也可以是在适当位置声明的切入点表达式。 */ @Before(“com.yao.aop.UserAspect.pintCut()”)
public void beforeAdvice(){ System.out.println(“before”); }
}

execution :
execution用于匹配方法执行 join points连接点,最小粒度方法,在aop中主要使用。
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern) throws-pattern?)这里问号表示当前项可以有也可以没有,其中各项的语义如下modifiers-pattern:方法的可见性,如public,protected;ret-type-pattern:方法的返回值类型,如int,void等;declaring-type-pattern:方法所在类的全路径名,如com.spring.Aspect;name-pattern:方法名类型,如buisinessService();param-pattern:方法的参数类型,如java.lang.String;throws-pattern:方法抛出的异常类型,如java.lang.Exception;
example:
@Pointcut(“execution(* com.chenss.dao..(…))”)//匹配com.chenss.dao包下的任意接口和类的任意方法@Pointcut(“execution(public * com.chenss.dao..(…))”)//匹配com.chenss.dao包下的任意接口和类的public方法@Pointcut(“execution(public * com.chenss.dao..())”)//匹配com.chenss.dao包下的任意接口和类的public 无方法参数的方法@Pointcut(“execution(* com.chenss.dao..(java.lang.String, …))”)//匹配com.chenss.dao包下的任意接口和类的第一个参数为String类型的方法@Pointcut(“execution(* com.chenss.dao..(java.lang.String))”)//匹配com.chenss.dao包下的任意接口和类的只有一个参数,且参数为String类型的方法
@Pointcut(“execution(* com.chenss.dao..(java.lang.String))”)//匹配com.chenss.dao包下的任意接口和类的只有一个参数,且参数为String类型的方法
@Pointcut(“execution(public * (…))")//匹配任意的public方法
@Pointcut("execution(
te*(…))”)//匹配任意的以te开头的方法@Pointcut(“execution(* com.chenss.dao.IndexDao.(…))")//匹配com.chenss.dao.IndexDao接口中任意的方法
@Pointcut("execution(
com.chenss.dao….(…))”)//匹配com.chenss.dao包及其子包中任意的方法

由于Spring切面粒度最小是达到方法级别,而execution表达式可以用于明确指定方法返回类型,类名,方法名和参数名等与方法相关的信息,并且在Spring中,大部分需要使用AOP的业务场景也只需要达到方法级别即可,因而execution表达式的使用是最为广泛的

winthin :
表达式的最小粒度为类// ------------// within与execution相比,粒度更大,仅能实现到包和接口、类级别。而execution可以精确到方法的返回值,参数个数、修饰符、参数类型等@Pointcut(“within(com.chenss.dao.)")//匹配com.chenss.dao包中的任意方法@Pointcut("within(com.chenss.dao…)”)//匹配com.chenss.dao包及其子包中的任意方法

jdk动态代理是基于接口来的,
动态带里的对象默认继承了Proxy对象,java是单继承的,所以只能去实现接口来实现动态代理。
在Proxy这个类当中首先实例化一个对象ProxyClassFactory,然后在get方法中调用了apply方法,完成对代理类的创建
其中最重要的两个方法generateProxyClass通过反射收集字段和属性然后生成字节defineClass0 jvm内部完成对上述字节的load

CGLIB动态代理,cglib封装了ASM这个开源框架,对字节码操作,完成对代理类的创建主要通过集成目标对象,然后完成重写,再操作字节码具体看参考ASM的语法

cglib是通过继承来操作子类的字节码生成代理类,JDK是通过接口,然后利用java反射完成对类的动态创建,严格意义上来说cglib的效率高于JDK的反射,但是这种效率取决于代码功力,其实可以忽略不计,毕竟JDK是JVM的亲儿子

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值