Spring Ioc和AOP思想

一、 Spring 简介

Spring 分层 full-stack (全栈)轻量级开源框架,以 IoC AOP 为内核,提供了展现层 SpringMVC 和业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库(比如整合Mybatis),已经成为使用最多的 Java EE 企业应用开源框架。
 

分层:表示spring可以运用在controler,service,dao三层的任意一层(springMVC、事务管理、spring data JPA)

full-stack:spring发展的越来越全,功能越来越多 ,可以提供一条龙服务,当做web应用只用spring就能搞定web应用开发

轻量级:spring运行就需要给我提供web容器,如果是SE应用就不需要web容器,有jar包和jvm就能跑起来,不需要依赖其他第三方软件,所以跑起来非常轻,这就是轻量级

 

二、核心思想

注意:IOC AOP 不是 spring 提出的,在 spring 之前就已经存在,只不过更偏向于理论化, spring 在技术层次把这两个思想做了非常好的实现(Java
 

2.1 IoC (控制反转/反转控制)

 1、什么是IoC

 IoC Inversion of Control  它是一个技术思想,不是一个技术实现。它描述的事情是Java开发领域对象的创建,管理问题。

传统开发方式:比如类A依赖于类B,往往会在类Anew一B的对象

IoC思想下开发方式:我们不用自己去new对象了,而是由IoC容器(Spring框架)去帮助我们实例化对象并且管理它,我们需要使用哪个对象,去问IoC容器要即可。

 这样我们丧失了一个权利(创建、管理对象的权利),得到了一个福利(不用考虑对象的创建、管理等一系列事情)

为什么叫做控制反转?

控制:指的是对象创建(实例化、管理)的权利

反转:控制权交给外部环境了(spring框架、IoC容器),(不反转是我们自己new对象)。   

图示:

 
Spring Ioc和AOP思想_第1张图片

 

2、IoC解决了什么问题

 IoC解决对象之间的耦合问题

说明:传统方式service层调用dao层方法,我们需要在UserServiceImpl类 new UserDaoImpl(),得到实例对象,然后调用dao层方法。当我们new时,就把UserServiceImpl和UserDaoImpl耦合在一起了,我们应该是面向UserDao接口开发,不应该看到UserDaoImpl这个实现类,这样非常不好。

当我们的dao层业务变化时不用UserDaoImpl这个实现类了,需要重新封装一个UserDao实现类UserDaoImplNew,这时我们service层所有写new UserDaoImpl()的地方全部就需要换成new UserDaoImplNew(),就有可能有成百上千的地方需要改变,耦合性太大了。

我们用IOC思想,就不用自己new对象了,直接去向IOC容器要对象即可,在service层声明一个接口即可,解决了耦合问题。

Spring Ioc和AOP思想_第2张图片

 

3、IoCDI的区别

DIDependancy Injection(依赖注入)

怎么理解:

IOCDI描述的是同一件事情,对象实例化及依赖关系维护,只不过角度不一样罢了

解释:

a对象声明了一个属性对象b,依赖b。a代表UserServiceImpl,b代表UserDaoImpl,

在UserServiceImpl类中声明一个属性UserDaoImpl,

站在对象的角度:UserServiceImpl需要UserDaoImpl,UserServiceImpl对象不用new UserDaoImpl()就可以使用这个对象,因为(控制反转)Ioc容器已经为我们实例化好了。

站在容器的角度:容器发现UserServiceImpl需要UserDaoImpl这个类,容器就把UserDaoImpl这个类注入到UserServiceImpl类

所以Ioc和DI描述是同一件事情 。

Spring Ioc和AOP思想_第3张图片

 

2.2 AOP

1、什么是AOP

AOP: Aspect oriented Programming 面向切面编程/面向方面编程

AOPOOP(面向对象)的延续,先说一下OOP

OOP三大特征:封装、继承和多态。OOP是一种垂直继承体系
 
举个例子,有三个动物类Horse、Pig、Dog,都有run()和eat()方法,发现有太多重复代码,我们可以把这些提取到一个父类接口Animal,子类继承就可以了。
 

如下:

Spring Ioc和AOP思想_第4张图片

OOP 编程思想可以解决大多数的代码重复问题,但是有一些情况是处理不了的,比如下面的在顶级父类Animal中的多个方法中相同位置出现了重复代码, OOP 就解决不了这些重复代码(横切逻辑代码)的问题,这个代码和业务代码耦合在了一起。
 
Spring Ioc和AOP思想_第5张图片

 

横切逻辑代码:在很多个纵向(代码顺序执行)流程中出现的相同子流程代码,我们称之为横切逻辑代码。

横切逻辑代码使用的场景很有限:一般用在事务控制、权限校验、日志 、性能监控

 

Spring Ioc和AOP思想_第6张图片

横切逻辑代码存在什么问题:
  • 横切代码重复问题
  • 横切逻辑代码和业务代码混杂在一起,代码臃肿,维护不方便

 以上问题AOP可以解决,AOP独辟蹊径提出横向抽取机制,将横切逻辑代码和业务逻辑代码分离 

 

Spring Ioc和AOP思想_第7张图片

2、AOP在解决什么问题

在不改变原有业务逻辑情况下,增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复,悄无声息的把横切逻辑代码应用到原有的业务逻辑中。(底层使用动态代理 实现的,在真正的方法执行前、执行后或者抛出异常的时候执行相应的代码逻辑)

 
3 、为什么叫做面向切面编程

 

切:指的是横切逻辑,原有业务逻辑代码我们不能动,只能操作横切逻辑代码,所以面向横切逻辑

面:横切逻辑代码往往要影响的是很多个方法,每一个方法都如同一个点,多个点构成面,有一个面的概念在里面。

 

 
 
 

你可能感兴趣的:(spring,java,spring)