Spring的IoC与AOP的理解
1.Spring它到底是什么?
Spring是一个开源的Java应用程序开发框架,为了解决企业应用开发的复杂性而创建的。
在spring中,它会认为一切Java类都是资源,而资源就是Bean,容纳这些Bean是Spring所提供的IoC(Inversion of Control)容器。Spring框架除了帮我们管理对象及其依赖关系(IoC),还提供像通用日志记录、性能统计、安全控制、异常处理等面向切面的能力(AOP),还能帮我管理最头疼的数据库事务,提供与第三方数据访问框架集成(如Hibernate、JPA),与各种Java EE技术整合(如Java Mail、任务调度等等),提供一套自己的web层框架Spring MVC、而且还能非常简单的与第三方web框架集成。
2.IoC它是一种思想
IoC—Inversion of Control,即“控制反转”,是一种设计思想。这样的思想是源自于生活的,其核心就是资源不由使用资源的双方管理,而由不使用资源的第三方管理。例如,我们每天使用的支付宝、微信支付等支付体系就可以说是一个庞大的IoC容器。
DI(依赖注入)其实就是对IoC设计思想的具体实现。IoC主要的实现方式有两种:依赖查找,依赖注入。依赖注入是一种更可取的方式。
回到Java中,IoC意味着将开发者编写的Java对象交给IoC容器控制,要理解IoC,就要抓住关键词"Control"。
作为开发者我们控制什么?
- 传统设计,我们需要访问对象的成员或使用对象中的方法时,我们需要在程序中通过new进行创建对象,是程序主动的去创建依赖对象。
IoC控制了什么?
- IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;是IoC 容器控制了对象即被动创建了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
反转就好理解了,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,就是正转;而反转则是由容器来帮忙创建及注入依赖对象。对象的控制权反转了。这就是一种控制反转的理念,它最大的好处在于降低对象之间的耦合。
IoC实际上是软件设计中依赖倒置原则的体现,有兴趣可以参考这篇文章。
3.面向切片编程AOP
AOP其实就是一种解耦的思想,并不神秘,其目的就是将项目业务逻辑代码与一些业务无关琐碎的事务代码分离开来。让开发者只关心业务逻辑部分,不用关系类似于数据库事务管理、日志管理等琐碎的事务。
SpringAOP建立在Java的反射基础之上,将分布在程序中的公共部分提取出来,做成了切面类(比如数据库事务)这样做的好处在于代码的可重用。一旦涉及到该功能的需求发生变化,只要修改该代码就行。
从生活中可以很容易举出例子,比如一个开发者A想把大象塞进冰箱,那么他就要:
- 打开冰箱
- 塞进大象
- 关掉冰箱
如果此时有开发者B想塞阿猫,开发者C想塞阿狗,那么他们都需要做的公共部分就是打开冰箱和关掉冰箱。那么现在要求,每次打开冰箱的时候都需要在日志上写上打开冰箱时间,这个时候就发现每个开发者都要加一个写上时间的步骤。在企业开发中,如果有成百上千个开发者,那么维护成本就会很高。
SpringAOP是怎么做的呢?
Spring把打开冰箱和关掉冰箱这两个动作提取出来做成一个切面类,找到切点(切点就是塞这个动作),然后织入(织入就是生成代理对象的过程)。下次开发者A去想要塞大象的时,Spring就会把冰箱打开好,开发者A塞进大象,Spring再来把冰箱关闭。开发者A现在只需要关注自己要干什么,而不必关心打开冰箱和关掉冰箱了。如果要求在每个开发者打开冰箱前在日志上写下打开时间,那么也只需要改一下切面类中的代码。
打开冰箱和关掉冰箱就相当于企业项目中的数据库事务,而塞大象就相当于业务逻辑代码。
AOP的实现
AOP有多种实现,最常使用的就是Spring AOP和AspectJ,Spring只是使用了与AspectJ5一样的注解,但仍然没有使用AspectJ的编译器,底层是动态代理技术的实现,并不依赖于AspectJ的编译器。
织入就是一个生成代理对象的过程,一般分为动态织入和静态织入,动态织入的方式是在运行时动态将要增强的代码织入到目标类中,这样往往是通过动态代理技术完成的,静态织入是指在编译时期就织入,即:编译出来的class文件,字节码就已经被织入了。
SpringAOP是采用动态织入
有两种实现方式
- 基于接口的动态代理(Dynamic Proxy)
- 基于继承的CGLIB代理
AspectJ是采用静态织入
使用AspectJ的acj编译器(类似javac)把aspect类编译成class字节码后,在java目标类编译时织入,即先编译aspect类再编译目标类。
Spring的IoC与AOP的理解的更多相关文章
- Spring 的 IOC 和 AOP 的理解
Spring 的 IOC 和 AOP 的理解: https://www.jianshu.com/p/bf1adc3b75e6 对Spring的核心(AOP和IOC)的理解(大白话) https://w ...
- 对spring中IOC和AOP的理解
IOC:控制反转也叫依赖注入.利用了工厂模式. 为了方便理解,分解成每条以便记忆. 1.将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器 ...
- Spring中IOC和AOP的理解
IOC和AOP是Spring的核心 IOC:控制反转:将创建对象以及维护对象之间的关系由代码交给了spring容器进行管理,也就是创建对象的方式反转了,交由spring容器进行管理. DI:依赖注入: ...
- Spring面试 IOC和AOP的理解
spring 的优点?1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实 ...
- 简单理解Spring之IOC和AOP及代码示例
Spring是一个开源框架,主要实现两件事,IOC(控制反转)和AOP(面向切面编程). IOC 控制反转,也可以称为依赖倒置. 所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B, ...
- Spring的IOC和AOP之深剖
今天,既然讲到了Spring 的IOC和AOP,我们就必须要知道 Spring主要是两件事: 1.开发Bean:2.配置Bean.对于Spring框架来说,它要做的,就是根据配置文件来创建bean实例 ...
- Spring 的IOC和AOP总结
Spring 的IOC和AOP IOC 1.IOC 许多应用都是通过彼此间的相互合作来实现业务逻辑的,如类A要调用类B的方法,以前我们都是在类A中,通过自身new一个类B,然后在调用类B的方法,现在我 ...
- Spring中IOC和AOP的详细解释(转)
原文链接:Spring中IOC和AOP的详细解释 我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂 ...
- Spring 的IOC 和Aop
Spring 的IOC 和Aop
随机推荐
- <数据挖掘导论>读书笔记11异常检测
异常检测的目标是发现与大部分其他对象不同的对象.通常,异常对象被称作离群点(Outlier). 异常检测也称偏差检测(Deviation detection),因为异常对象的属性值明显偏离期望的或者常 ...
- Charles 抓取 iphone https的设置方式
1. Charles: help > SSL Proxying > Install Charles Root Certificate, 2. 将会打开 钥匙串访问 的功能,查找 Char ...
- Angular2-三种样式封装策略的区别
Angular2有三种样式封装方式,分别是None.Native.Emulated. 可用元数据“encapsulation”配置,配置方式如下: encapsulation: ViewEncapsu ...
- linux中find与rm实现查找并删除文件
find命令: find . -name '*.log' #查找当前目录下的log文件 查找并删除: find . -name '*.log' -type f -print -exec rm -rf ...
- 【11】Redis .net 实例 StackExchange.Redis框架
1.创建测试项目并下载nuget包:StackExchange.Redis PM> Install-Package StackExchange.Redis 2.创建 RedisHelper类 p ...
- poj 1833 排列 STL 全排列公式
排列 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 15173 Accepted: 6148 Description 题 ...
- 设计模式入门,策略模式,c++代码实现
// test01.cpp : Defines the entry point for the console application.////第一章,设计模式入门,策略模式#include &quo ...
- Win10系统安装vmware workstation 12后没有桥接网卡怎么办
原文 vmware workstation是一款虚拟机计算机软件,可以同时运行不同的操作系统,然而有win10系统用户在安装vmware workstation 12之后,却发现网络连接里面没有桥接网 ...
- lambda 表达式学习笔记
在Java中传递一个代码段并不容易,不能直接传递代码段.Java是一个面向对象语言,所以必须构造一个对象,这个对象的类需要一个方法能包含所需的代码.lambda的出现有效的解决这个问题,让代码变得更加 ...
- RESTORE DATABASE命令还原SQLServer 2005 数据库
--返回由备份集内包含的数据库和日志文件列表组成的结果集. --主要获得逻辑文件名 USE master RESTORE FILELISTONLY FROM DISK = 'g:\back.Bak' ...