-
1.为什么要引入AOP的编程范式
引入AOP的编程范式去处理那些OOP不能处理的问题或不好处理的问题,例如视频中老师说的权限控制问题。又比如一个方法中要插入数据到两张表中时,这一次操作是同一个事务,要么同时失败,要么同时成功,这时是不能用面向对象(OOP)编程去实现的。
2.AOP的好处以及适用场景是什么?
能够减少大量的重复代码,视频中所言;又如事务控制时,我们只需要在方法上加@transaction就可以在该方法上启用事务机制,如果发生异常,那么事务会进行自动回滚。这样,我们开发人员能够更加的关注业务代码的开发,而不是事务代码的编写。
3.AOP的两大核心是什么?
AOP的两大核心就是分离软件系统功能性需求(核心关注点)和非功能性需求(非核心关注点),业务处理的主要流程将集中在核心关注点处。
查看全部 -
AOP的核心特点
1,解决代码重复;
2,关注点转移(分离)
关注点有水平分离、垂直分离以及功能分离(AOP)
水平分离:一般的持久层->服务层->展示层
垂直分离:业务模块的分离->订单系统、支付系统等
功能分离:将非功能部分,分离(转移)到功能部分进行管理
查看全部 -
jdk运行期动态代理源码解析:其实就是真实类实现一个接口,我们再写一个类似于切面的类,实现invocationhandler接口且实现invoke方法,同时要保存真实类对象,初始化时赋值对象,invoke方法中反射方式调用真是对象方法,在方法前后可以加上定制的逻辑,这个方法其实是动态代理对象调用的,动态代理对象是客户端通过动态代理类实例化的,而动态代理类是真实对象方法执行前的运行期生成的.class类,这个类实现了和真实对象一样的接口,所以也有真实对象的方法,调用代理对象方法时也就可以传入参数,然后代理对象再将方法和参数传递给invocationhandler的实例对象。查看全部
-
主要几个注解
@Aspect说明这个类是切面配置的类(这个类由@Pointcut切面表达式和Advice两部分组成)
@Pointcut表示在哪些类中哪些方法植入代码
Advice(5种)表示植入时机
查看全部 -
Pointcut匹配对象
@Pointcut("this()"),实现类,代理对象;
@Pointcut("target()"),所有实现他的类
@Pointcut("bean()") 过滤spring托管的bean的实例,通过bean的名称进行过滤
查看全部 -
AOP注解注解实现:
@Aspect:切面 = 切点+通知(手动添加的代码,一般是方法); @Point:切点,横切关注点;
@Before(前置通知):添加的内容在切点之前执行;
@After(后置通知): 添加的内容在切点之后执行
还有环绕通知,异常通知,返回通知
------------------------------------
@Autowired:自动装配,与Spring注入相关,可按类型、名装配; Spring注解@Component、@Controller、@Service、@Repository;
传统方式的缺点:这种方式属于硬编码,对引入者代码是有侵入的。如果对删除或增加产品还有其它关联操作,添加代码时会增加代码复杂度。而AOP会将校验分离出来变成无侵入
查看全部 -
Pointcut :切面表达式 designators:指示器,描述通过什么方式去匹配Java的那些方法 execution():匹配方法 匹配注解 @target() @args() @within() @annotation() within():匹配包/类型 this()/bean()/target():匹配对象 args():匹配参数 wildcards:通配符(*:匹配任意数量的字符;+匹配指定类及其子类;..:一般用于匹配任意数的子包或参数) operators: 运算符(&&:与操作符;||或;!:非)查看全部
-
静态代理就是一个代理类根据被代理类的情况,被代理类有几个方法,代理类就需要有几个方法,每个方法都要对被代理类进行代理,这样会出现代码重复的情况,如多个被代理方法其实前后需要执行的逻辑是一样的,但是静态代理还是需要为每个方法写一个代理方法,造成代码重复。动态代理根据放射得到被代理类执行的方法和参数,避免了代码的重复。查看全部
-
这一页内容比较多。 无法对final类进行代理,因为final类不能被继承 关于Cglib无法对static类和方法进行代理: 单一的类是没有static修饰符的,只有静态类内部可以用static修饰; 对于static方法,它是属于类的,子类在不重写的情况下,是可以调用的,但是一旦重写了就无法调用了,普通的public方法可以通过super.method()调用,但是static方法不行查看全部
-
1.解决代码重复性问题 2.关注点分离 水平分离: 垂直分离:业务角度 切面分离:非功能性需求从功能性需求中剥离出来,集中管理。查看全部
-
Spring AOP
编程范式种类概览
1、面向过程编程
2、面向对象编程
3、函数式编程
4、事件驱动编程
5、面向切面编程
AOP
是一种对 面向对象编程 的补充,用来解决特定问题的编程范式,并不是适合所有场景。
初衷:
do not repeat yourself,减少重复代码
separate of concern,关注分离
水平分离,展示层->服务层->持久层
垂直分离,模块划分(订单,库存)
切面分离,把 功能性需求 与 非功能性需求 分开
好处:
集中处理某一关注点/横切逻辑
很方便地添加/删除关注点
侵入性少,增强代码可读性和可维护性
(我们把一些功能的共同性抽取出来,通过一个AOP拦截注入,需要的地方加一个注解即可,不需要之后把注解去掉即可,这些共同功能只需要在一个拦截器维护即可,减少代码,侵入性低,维护很方便,比如存在有一些job调度任务只能单点允许,但是服务是多台部署,就需要解决锁竞争,获取锁的单点即可执行调度,就可以把锁竞争分离出来,放入拦截器中,需要调度的地方加入注解即可)
适用场景:
权限控制 如shiro就是方便通个注解注入,然后拦截
缓存控制
审计日志 如统一打接口参数日志,不用在每个接口处记录
事物控制 spring的@Transaction
性能监控
异常处理 接口统一异常拦截返回
分布式追踪
查看全部 -
第三步:
/**
* //匹配任何公共方法
@Pointcut("execution(public * com.imooc.service.*.*(..))")
//匹配com.imooc包及子包下Service类中无参方法
@Pointcut("execution(* com.imooc..*Service.*())")
//匹配com.imooc包及子包下Service类中的任何只有一个参数的方法
@Pointcut("execution(* com.imooc..*Service.*(*))")
//匹配com.imooc包及子包下任何类的任何方法
@Pointcut("execution(* com.imooc..*.*(..))")
//匹配com.imooc包及子包下返回值为String的任何方法
@Pointcut("execution(String com.imooc..*.*(..))")
//匹配异常
execution(public * com.imooc.service.*.*(..) throws java.lang.IllegalAccessException)
* Created by cat on 2017-02-19.
*/
@Aspect
@Component
public class ExecutionAspectConfig {
@Pointcut("execution(public * com.imooc.service..*Service.*(..) throws java.lang.IllegalAccessException)")
public void matchCondition(){}
@Before("matchCondition()")//before代表要执行插入的逻辑
public void before(){
System.out.println("");
System.out.println("###before");
}
}查看全部 -
1.为了解决oop面向对象的不足
2.(1)降低模块之间的耦合
(2)实现代码的复用
(3)使程序更容易扩展
场景:日志记录,性能统计,安全控制,事务处理,异常处理
3.使用动态代理和使用静态织入
查看全部 -
aop注解方式
查看全部 -
匹配注解
//匹配方法标注有AdminOnly的注解的方法
@Pointcut("@annotation(com.imooc.demo.security.AdminOnly)")
public void annoDemo(){}
//匹配标注有Beta的类底下的方法,要求的annotation的RetentionPolicy级别为CLASS
@Pointcut("@within(com.google.common.annotations.Beta)")
public void annoWithinDemo(){}
//匹配标注有Repository的类底下的方法,要求的annotation的RetentionPolicy级别为RUNTIME
@Pointcut("@target(org.springframework.stereotype.Repository)")
public void annoTargetDemo(){}
//匹配传入的参数类标注有Repository注解的方法
@Pointcut("@args(org.springframework.stereotype.Repository)")
public void annoArgsDemo(){}
查看全部
举报