Spring入门导读——IoC和AOP
和MyBatis系列不同的是,在正式开始Spring入门时,我们先来了解两个关于Spring核心的概念,IoC(Inverse of Control)控制反转和AOP()面向切面编程。
1.IoC(Inversion of Control)控制反转
什么是控制反转呢?可以这么通俗的来解释,我们通常写代码当一个类会关联另一个类是会直接在这个类里new,例如:
package day_30_spring; /**
* @author 余林丰
*
* 2016年10月30日
*/
public class People {
private Eat eat; /**
* 在构造方法中创建Eat的对象实例
*/
public People(){
eat = new Eat();
} }
现在我们将对象的控制权“反转”,交由第三方容器进行管理,即交由Spring容器帮我们管理,使得我们不再People代码中与Eat对象紧耦合。在看下面的代码:
package day_30_spring; /**
* @author 余林丰
*
* 2016年10月30日
*/
public class People {
private Action eat; /**
* 在构造方法中创建Eat的对象实例
*/
public People(Action eat){
this.eat = eat;
} }
Eat类是继承至Action接口的,这实际上就是通过依赖注入(DI,Dependency Inversion)的方式来实现控制反转。通过构造方法来注入。不依赖于具体的Action接口实现,我们只需要传递一个Action接口类进去即可。相比于之前的“传统”代码紧紧的依赖Action的具体实现Eat类,这个代码实际上解了代码的耦合性。Spring有两种构造方式,一种就是我们上面说到的构造器注入,另一种就是set方法注入。所以,IoC的很简单,目的是解耦,手段是通过依赖注入。Spring容器帮我们解决了一切。
2.AOP(Aspect Oriented Programming)面向切面编程
那什么又是面向切面编程呢?如果你有了解过代理模式,那么就对AOP比较容易理解了,AOP的原理实际上也是通过动态代理的方式实现的。我们来看下面这个例子:对数据库的操作前会有日志记录,对数据库的操作完后也会有日志记录,“通常”我们可能会这么写。
package day_30_spring; /**
* @author 余林丰
*
* 2016年10月30日
*/
public class People {
private Logger logger = new Logger(); public void insert(int i){
logger.beforeInsert(); //插入前的日志记录
//此处插入一条数据
logger.afterInsert(); //插入后的日志记录
}
}
“单一职责”告诉我们,这样写到底好不好呢?日志记录是People该做的事吗?难道它不应该只负责插入数据的操作吗?正确的做法应该是这么的在People类中只有这几句代码:
package day_30_spring; /**
* @author 余林丰
*
* 2016年10月30日
*/
public class People { public void insert(int i){
//此处插入一条数据
}
}
那我们怎么在insert方法中先记录日志呢?我们可以用动态代理来实现,即创建一个代理类的对象实例,Spring也已经为我们做好了这件事,仅仅需要配置一下几句话,即可实现。
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<!-- 省略其他配置,只配置aop -->
<aop:config>
<aop:aspect ref="logger">
<aop:pointcut id="insert" expression="execution(* *.insert(..))"/>
<aop:befor point-ref="insert" method="beforeInsert"/>
<aop:after point-ref="insert" method="afterInsert"/>
</aop:aspect>
</aop:config>
</beans>
事实上我们能实现最开始我们“糟糕”代码的功能了,而且更优美。在这里我们仅仅对IoC和AOP做一个简单的了解,在后面会和MyBatis一样,先学会从第一步配置,再学会怎么用,最后再来了解框架源代码原理等等。
Spring入门导读——IoC和AOP的更多相关文章
- 详谈 Spring 中的 IOC 和 AOP
这篇文章主要讲 Spring 中的几个点,Spring 中的 IOC,AOP,下一篇说说 Spring 中的事务操作,注解和 XML 配置. Spring 简介 Spring 是一个开源的轻量级的企业 ...
- Spring入门2. IoC中装配Bean
Spring入门2. IoC中装配Bean 20131125 前言: 上一节学习了Spring在JavaProject中的配置,通过配置文件利用BeanFactory和ApplicationConte ...
- Spring入门1. IoC入门实例
Spring入门1. IoC入门实例 Reference:Java EE轻量级解决方案——S2SH 前言: 之前学习过关于Spring的一点知识,曾经因为配置出现问题,而总是被迫放弃学习这些框架技术, ...
- Spring入门(9)-AOP初探
Spring入门(9)-AOP初探 0. 目录 什么是面向切面编程 AOP常见术语 AOP实例 参考资料 1. 什么是面向切面编程 Aspect Oriented Programming(AOP),即 ...
- Spring核心思想Ioc和Aop (面试)
Spring核心思想Ioc和Aop (面试) 注意: Ioc和Aop并不是Spring提出的,在Spring之前就已经存在,Spring只是在技术层面给这两个思想做了非常好的实现. 1 Ioc 1.1 ...
- Spring入门及IoC的概念
Spring入门 Spring是一个轻量级的Java开发框架,最早由Robd Johnson创建,目的为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题,它是一个分层的JavaSE/EE轻量级开源 ...
- Spring学习笔记IOC与AOP实例
Spring框架核心由两部分组成: 第一部分是反向控制(IOC),也叫依赖注入(DI); 控制反转(依赖注入)的主要内容是指:只描述程序中对象的被创建方式但不显示的创建对象.在以XML语言描述的配置文 ...
- Spring入门(三)— AOP注解、jdbc模板、事务
一.AOP注解开发 导入jar包 aop联盟包. aspectJ实现包 . spring-aop-xxx.jar . spring-aspect-xxx.jar 导入约束 aop约束 托管扩展类和被扩 ...
- 【转】Spring的中IoC及AOP
1. Spring介绍 Spring是轻量级的J2EE应用程序框架.Spring的核心是个轻量级容器(container),实现了IoC(Inversion of Control)模式的容器,Spri ...
随机推荐
- nginx 入门配置
这个星期公司的定期分享内容是Nginx,于是就要写作业了. 一.动静分离 1.下载Windows 版本的Nginx,解压,放到C盘下.进入目录,然后按然shift键右键,打开命令行,输入: start ...
- 快速找到Office应用程序安装路径
p{ font-size: 15px; } .alexrootdiv>div{ background: #eeeeee; border: 1px solid #aaa; width: 99%; ...
- nosql使用感受
最近一个项目尝试了使用ssdb(一个类似于redis的数据结构数据库),主要感受有几点: 优势 nosql的无模式在修改和插入时很方便,不需要预先新建表或者修改表结构来新加字段,只需要代码里面使用就行 ...
- 玩转 SSH 目录
在做一个新的项目的时候,需要重新搭建一个项目. 于是趁着这个机会把之前学的几个框架的搭建都写一写,整理一下,同时也可以给大家一些参考.何乐而不为叻. 在这个系列中, 我将使用 IntelJ IDEA ...
- JavaScript基础学习(五)—其他引用类型
JavaScript定义了两个内置对象: Global和Math. 一.Global对象 1.URI编码方法 Global对象的encodeURI()和encodeURICompo ...
- laravel安装插件laravel-ide-helper
1.插件位置laravel-ide-helper https://github.com/barryvdh/laravel-ide-helper 2.首先改变镜像源为国内的镜像源 P { margin- ...
- mysql 分析5语句的优化--索引添加删除
查看表的索引 show create table 表名; show index from 表名; show keys from表名; 添加索引 alter table 表名 add index 索 ...
- 【转载】关于c++中的explicit
按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class String { String ( const char* p ); ...
- Spring+Redis(keyspace notification)实现定时任务(订单过期自动关闭)
1.起因 最近公司项目要做订单超期未支付需自动关闭,首先想到的是用spring的定时器(@Schedule),结果领导举各种例子说会影响性能,只能作罢.后来想能不能基于redis实现, 学习(baid ...
- [转]DevExpress GridControl 关于使用CardView的一点小结
最近项目里需要显示商品的一系列图片,打算用CardView来显示,由于第一次使用,遇到许多问题,发现网上这方面的资源很少,所以把自己的一点点实际经验小结一下,供自己和大家以后参考. 1.选择CardV ...