首页 > 编程知识 正文

spring aop原理面试,spring ioc原理

时间:2023-05-06 02:43:23 阅读:32280 作者:1704

Spring AOP 1.AOP概念辅助编程(AOP )面向断开连接的编程

(1) .是面向对象编程OOP的补充

面向对象编程是静态地考虑程序结构的面向切片的编程,动态地考虑程序的执行过程(2).AOP在需要提取并执行程序重复的代码的情况下使用动态代理的技术

(3).AOP的基础是使用动态代理模型实现的: JDK的动态代理和CGLIB的动态代理

(4) .作用和优势

角色:在程序运行期间,在不修改源代码的情况下增强现有方法。 优点:减少重复代码、提高开发效率、便于维护的面向切片的编程是将交叉业务逻辑封装在切片中,利用AOP容器的功能来组织切片

主要业务逻辑中。 交叉业务逻辑是与常见主要业务逻辑无关的代码,如安全检查、事务和日志。

如果不使用AOP,就会发生代码纠缠。 也就是说,交叉业务逻辑和主业务逻辑混合在一起。 这样一来,主业务的逻辑就会变得模糊。

例如,在实际转移业务逻辑之前和之后,转移需要权限管理、日志记录、事务加载和事务终止

业务等跨越了业务逻辑,但这些业务逻辑和主业务逻辑之间没有直接的关系。 但是,那些代码量

达到整体代码量的一半以上。 它们的存在不仅产生了大量的“冗馀”代码,而且严重干扰了主要业务逻辑-转移。

2 .动态代理模型:在说动态代理之前,我先介绍一下代理模型Java中的代理,客户端类通过中间层访问,而不是直接与委托类交互,中间层就是代理。 为什么这么说,是因为使用代理有两个优点。

可以隐藏委托类的实现实现了客户端与委托类之间的解绑定,并且可以在不修改委托类代码的情况下添加处理静态代理

(1)静态代理)程序员编写,特定工具自动生成源代码。 也就是说,在编译时接口已经由代理类、代理类等确定。 在程序运行之前,将生成代理类的. class文件。

动态代理

)1)动态代理的作用)在不改变源代码的情况下加强现有方法。 (是AOP思想的实现技术)

)2)分类:

基于接口的动态代理基于子类的动态代理示例:

以前,演员和剧团直接见面联系。 没有中间人。 现在,一个叫yedfbx (中间人)的新职业应运而生。 这个时候,剧组想找演员的话就需要用yedfbx找。 剧组为了寻找符合要求的演员,首先制作被要求的界面。 演员当选需要实现这个界面。

(3)两种动态代理)基于接口的动态代理

要求:被代理类至少实现一个接口提供程序: JDK参与的类: Proxy如何创建代理: newproxyinstance(Class[]loader,class )、invococy 一般是固定的写法。 actor.getClass ().getClassLoader ) )。 - Class[] :字节码数组。 由代理类实现的接口。 (代理对象和被代理对象要求执行相同的动作)。 一般是固定的写法。 actor.getClass ().get接口) )。 - InvocationHandler :用于提供扩展代码的接口。 一般来说,写那个接口的实现类。 实现类可以是匿名内部类,也可以不是。 -意思是,怎么代理? 这里的代码只是谁用谁提供。 -策略模式:使用场景必须已有数据; 目的明确; 实现目标的过程是战略。 dbutils的结果处理器是策略模型的具体应用。 invoke (对象代理,方法方法,对象[ ] args ) )。

在执行对象到代理的方法时,它将通过该方法。 此方法具有拦截功能。 参数: proxy :对代理对象的引用。 method :当前正在执行的方法对象args :执行方法所需的参数返回值:当前正在执行的方法的返回值基于子类的动态代理

要求:被代理类不能是最终类。 无法用final限定的提供程序:第三方CGLib参与的类:增强器如何创建代理对象: create(class,Callback ); 参数含义: Class :被代理的字节码Callback :如何代理? 与InvocationHandler的作用相同。 也是接口,通常使用该接口的子接口MethodInterceptor。 使用时,也是创建此接口的匿名内部类。 3.AOP相关术语(1).Joinpoint(连接点):

连接点是指被拦截的点。 在spring中,spring只支持方法类型的连接点,因此这些点指向方法。 (服务层接口的方法)

(2).Pointcut(切入点):

切口是指监听哪个连接点的定义。 (在动态代理增强的方法中,切口必须是连接点,连接点不一定是切口。)

(3).Advice(通知/增强)

:
所谓通知是指拦截到Joinpoint之后所要做的事情。通知定义了增强代码切入到目标代码的时间点。
通知的类型:前置通知,后置通知,异常通知,最终通知,环绕通知。
(4). Introduction(引介):
引介是一种特殊的通知,在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field。
(5). Target(目标对象):
代理的目标对象,即要被增强的对象。
(6). Weaving(织入):
意思是指把增强应用到目标对象来创建新的代理对象的过程。

增强的代码进入service类执行的过程spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入。

(7). Proxy(代理):
一个类被AOP织入增强后,就产生一个结果代理类。
(8). Aspect(切面):
是切入点和通知(引介)的结合。
例如事务处理、日志处理可以理解为切面。实际就是对主业务逻辑的一种增强。

4.配置常用的标签

(1). <aop:config>
作用:用于声明开始aop的配置
(2). <aop:aspect>
作用:用于配置切面。
属性:

id:给切面提供一个唯一标识。ref:引用配置好的通知类bean的id。

(3). <aop:pointcut>
作用:用于配置切入点表达式
属性:

expression:用于定义切入点表达式。id:用于给切入点表达式提供一个唯一标识。

(4). <aop:before>
作用:用于配置前置通知
属性:

method:指定通知中方法的名称。pointct:定义切入点表达式pointcut-ref:指定切入点表达式的引用

(5). <aop:after-returning>
作用:用于配置后置通知
属性:

method:指定通知中方法的名称。pointct:定义切入点表达式pointcut-ref:指定切入点表达式的引用

(6). <aop:after-throwing>
作用:用于配置异常通知
属性:

method:指定通知中方法的名称。pointct:定义切入点表达式pointcut-ref:指定切入点表达式的引用

(7). <aop:after>
作用:用于配置最终通知
属性:

method:指定通知中方法的名称。pointct:定义切入点表达式pointcut-ref:指定切入点表达式的引用

(8). <aop:around>
作用:用于配置环绕通知
属性:

method:指定通知中方法的名称。pointct:定义切入点表达式pointcut-ref:指定切入点表达式的引用 4.AOP常用的注解

(1). @Aspect:

作用:把当前类声明为切面类。

(2). @Before:

作用:把当前方法看成是前置通知。属性:value:用于指定切入点表达式,还可以指定切入点表达式的引用。

(3). @AfterReturning

作用:把当前方法看成是后置通知。 属性:value:用于指定切入点表达式,还可以指定切入点表达式的引用。

(4). @AfterThrowing

作用:把当前方法看成是异常通知。 属性:value:用于指定切入点表达式,还可以指定切入点表达式的引用。

(5). @After

作用:把当前方法看成是最终通知。属性:value:用于指定切入点表达式,还可以指定切入点表达式的引用。

(6). @Around

作用:把当前方法看成是环绕通知。 属性:value:用于指定切入点表达式,还可以指定切入点表达式的引用。

(7). @Pointcut

作用:指定切入点表达式属性:value:指定表达式的内容

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。