您的位置:首页 > 运维架构

Spirng AOP IOC DI 理解

2020-02-01 20:35 92 查看

spring本身提升的在项目中创建对象对对象的一个管理,他那个底层不是用动态代理模式,把它拿个容器帮你去动态创建那个实例,给你创建的那个实例进行一个保管,他帮你保管,他把那个DI依赖机制,就是一个spring容器帮你去管理你创建的实例.

AOP:

A话术:面向切面编程,我想去实现某个功能,这个功能可能说,我不想去让他直接去使用这个方法,我实现这个功能之前我还要做一些操作,我还不想修改他本身,我要对他进行一个代理就用的这个aop;
B话术:面向切面编程,把散落在程序中的公共部分提取出来,做成切面类,这样的好处在于,代码的可重用,一旦涉及到该功能的需求发生变化,只要修改该代码就行,否则,你要到处修改,如果只要修改1、2处那还可以接受,万一有1000处呢。
AOP底层的东西就是JDK动态代理和CGLIB代理,说白了就是增强类的功能。
最常用的AOP应用在数据库连接以及事务处理上。
通知:
1.@Before 前置增强(目标方法执行之前,执行注解标注的内容)

2.@AfterReturning 后置增强(目标方法正常执行完毕后,执行)

3.@Around 环绕增强(目标方法执行前后,分别执行一些代码)

4.@AfterThrowing 抛出增强(目标方法发生异常,执行)

5.@After Final增强(不管是抛出异常还是正常退出,该增强都会得到执行。一般用于释放资源,相当于 我的原代码没有改变我的实现类没有改变,还增加了业务

面向切面编程,把散落在程序中的公共部分提取出来,做成切面类,这样的好处在于,代码的可重用,一旦涉及到该功能的需求发生变化,只要修改该代码就行,否则,你要到处修改,如果只要修改1、2处那还可以接受,万一有1000处呢。

AOP底层的东西就是JDK动态代理和CGLIB代理,说白了就是增强类的功能。
最常用的AOP应用在数据库连接以及事务处理上。
我用的是cglib,因为我在网上查的是这个springAOP用jdk要有接口,但spring里面好像没有接口,所以就用这个cglib动态代理

C话术:面向切面编程(AOP),简单来说就是可以把业务流程中通用的功能抽取出来编写成功能代码,然后在业务流程执行中根据流程需要把抽取出来的功能切进去。举例:系统的日志功能,我们每写一个功能就需要记录一下日志(或者调用记录日志的公共方法),这样的话代码会很杂,很多相似的代码就会出现,费时费力还不讨好。如果我们面向切面呢?那就简单多了,我们只需要将公共的日志代码注入到需要记录日志的地方,这样一来我就只需考虑我该怎么实现某某功能,不用去考虑记录日志之类的事项。

Spring IOC
()控制反转(Inversion Of Control),这是 spring 的核心,是一种设计思想。所谓IOC 就是由spring 来负责控制对象的生命周期以及它们之间的关系。举个例子:我需要租个房子,首先我要去满大街找出租的房子,然后需要知道每个出租的房子的信息(价格,地段,面积,租期等等),然后我再根据了解到的信息挨个筛选,到最后选出自己心仪的那个房子。这个过程很复杂很费事儿,从开始找到最后定下来租都需要我参与。与传统的程序开发类似,在一个对象中如果我想使用另外一个对象,我就得先得到它(new ),到最后不用了我还要销毁(Connection),这样程序的耦合度就高了。用@Autowired获取我想要的数据

那么我们有没有省事儿的办法呢?诶,这个时候租房中介就来了(IOC),有了它们我就省了很多事儿,我只需要告诉他们我要找哪个地段的,大概多少钱的,多大面积的…他们就会根据手里的资源进行筛选,然后告诉我哪个房子合适,我就开始租用入住,很省事儿。回到程序中,所有的类都会在Spring容器中进行登记,告诉spring你是什么,然后你又需要哪些,然后spring会在程序运行到适当时,主动把你需要的给你,然后也会把你给到需要你的东西。所有类的创建、销毁都由spring这个容器控制,就是说控制对象生命周期的不是调用它的对象,而是spring。对于某个具体对象而言,以前是它控制其它对象,现在是所有对象都由spring来控制,所以叫做控制反转。

DI
依赖注入(DI)是对IOC的另一种理解,DI 是spring IOC 在程序运行中动态的向某个对象提供它所需要的其它对象。举个例子:比如我们的ControllerA中需要一个serviceA对象,如果按传统的方法就是需要自己去new一个serviceA。但是有了spring,我们就只需告诉spring我们需要serviceA,然后spring会根据我们的需要去进行创建。而我们就不需要关心它具体是怎么创建的。我们ControllerA需要依赖serviceA才能正常运行使用,而这个serviceA是由spring注入到ControllerA中的,所以叫做依赖注入。DI的底层是通过java的反射来实现对象注入的。

  • 点赞
  • 收藏
  • 分享
  • 文章举报
放牛的小牧童 发布了7 篇原创文章 · 获赞 0 · 访问量 151 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: