java面试题:Spring 的 AOP 和 IOC 是什么?

内容分享1个月前发布
0 0 0

java面试题:Spring 的 AOP 和 IOC 是什么?

AOP:面向切面编程

即在一个功能模块中新增其他功能,比方说你要下楼取个快递,你同事对你说帮我也取一下呗,你就顺道取了。在工作中如果系统中有些包和类中没有使用 AOP,例如日志,事务和异常处理,那么就必须在每个类和方法中去实现它们。 代码纠缠每个类和方法中都包含日志,事务以及异常处理甚至是业务逻辑。在一个这样的方法中,很难分清代码中实际做的是什么处理。AOP 所做的就是将所有散落各处的事务代码聚焦到一个事务切面中。

场景

比方说我目前要弄一个日志,记录某些个接口调用的方法时间。使用 Aop 我可以在这个接口前插入一段代码去记录开始时间,在这个接口后面去插入一段代码记录结束时间。又或者你去访问数据库,而你不想管事务(太烦),所以,Spring 在你访问数据库之前,自动帮你开启事务,当你访问数据库结束之后,自动帮你提交/回滚事务!异常处理你可以开启环绕通知,一旦运行接口报错,环绕通知捕获异常跳转异常处理页面。

动态代理

Spring AOP 使用的动态代理,所谓的动态代理就是说 AOP 框架不会去修改字节码,而是在内存中临时为方法生成一个 AOP 对象,这个 AOP 对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。它的动态代理主要有两种方式,JDK 动态代理和 CGLIB 动态代理。JDK 动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK 动态代理的核心是 InvocationHandler 接口和 Proxy 类。如果目标类没有实现接口,那么 Spring AOP 会选择使用 CGLIB 来动态代理目标类。CGLIB 是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB 是通过继承的方式做的动态代理,因此如果某个类被标记为 final,那么它是无法使用 CGLIB 做动态代理的。

IOC:依赖注入或者叫做控制反转

正常情况下我们使用一个对象时都是需要 new Object()的。而 ioc 是把需要使用的对象提前创建好,放到 spring 的容器里面。所有需要使用的类都会在 spring 容器中登记,告知 spring 你是个什么东西,你需要什么东西,然后 spring 会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring 来控制,也就是说控制对象生存周期的不再是引用它的对象,而是 spring。DI(依赖注入)实则就是 IOC 的另外一种说法,实则它们是同一个概念的不同角度描述。

场景:

正常情况下我们使用一个对象时都是需要 new Object() 的。而 ioc 是把需要使用的对象提前创建好,放到 spring 的容器里面。需要使用的时候直接使用就行,而且可以设置单例或多例,超级灵活。我们在 service 层想调用另外一个 service 的方法,不需要去 new 了,直接把它交给 spring管理,然后用注解的方式引入就能使用。

IOC 三种注入方式

(1)XML:Bean 实现类来自第三方类库,例如 DataSource 等。需要命名空间等配置,例如:context,aop,mvc。

(2)注解:在开发的类使用@Controller,@Service 等注解

(3)Java 配置类:通过代码控制对象创建逻辑的场景。例如:自定义修改依赖类库。

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...