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
随机推荐
- 经典实用的iptables shell脚本
先解释一下iptables里的参数意思:A: 添加 (跟链)-I: 插入-p: 跟协议-s: 源IP-d: 目标IP-j: 操作行为-t: 加表--to-source:SNAT用,表示改成的SNAT源 ...
- Redis 【keys】 一句话说明
DEL----------------------------------删除给定的一个或多个key DUMP--------------------------------序列化给定key,并返回被 ...
- Java中HashSet的解读
一. HashSet源代码 HashSet 的实现 对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的 ...
- 如鹏网学习笔记(五)MySql基础
MySQL基础 一.数据库概念 1,网友装备信息.论坛帖子信息.QQ好友关系信息.学籍管理系统中的学生信息等都要“持久化”的保存到一个地方, 如果通过IO写到文件中,那么会非常麻烦,而且不利于多人共享 ...
- [PHP] 从PHP 5.6.x 移植到 PHP 7.0.x不兼容点
1.错误和异常处理 1.1 set_exception_handler()函数申明的类型 function handler($e){ var_dump($e); } set_exception_han ...
- 浅谈 Linux 下的 SSH1, SSH2
SSH:Secure Shell .是一种安全协议. 常见的应用场景是远程控制台登陆. SSH1免费,SSH2收费. 其实 SSH 并不只是在 Linux 和 Unix 下使用,他们同样在 Win ...
- 线程与全局解释器锁(GIL)
一.线程概论 1.何为线程 每个进程有一个地址空间,而且默认就有一个控制线程.如果把一个进程比喻为一个车间的工作过程那么线程就是车间里的一个一个流水线. 进程只是用来把资源集中到一起(进程只是一个资源 ...
- oracle删除归档日志
查看归档模式: SQL> archive log list; Database log mode Archive Mode Automatic archival Enabled Archive ...
- WinForm实现Rabbitmq官网6个案例-RPC
获取源码 客户端代码: namespace RabbitMQDemo { public partial class RPC : Form { private readonly static RPC _ ...
- ARCGIS 10.0破解版安装过程error 1606 和error 1316问题 及安装流程
来自:http://blog.csdn.net/don_lvsml/article/details/8681100 楼主今天安装ESRI.ArcGIS.10.CS时,由于第一次接触该软件,将其按照一般 ...

