1.程序中为什么会用到spring的ioc和aop

2.什么是IOC,AOP,以及使用它们的好处,即详细回答了第一个问题

3.原理

关于1:

a:我们平常使用对象的时候,一般都是直接使用关键字类new一个对象,那这样有什么坏处呢?其实很显然的,使用new那么就表示当前模块已经不知不觉的和 new的对象耦合了,而我们通常都是更高层次的抽象模块调用底层的实现模块,这样也就产生了模块依赖于具体的实现,这样与我们JAVA中提倡的面向接口面向抽象编程是相冲突的,而且这样做也带来系统的模块架构问题。很简单的例子,我们在进行数据库操作的时候,总是业务层调用DAO层,当然我们的DAO一般 都是会采用接口开发,这在一定程度上满足了松耦合,使业务逻辑层不依赖于具体的数据库DAO层。但是我们在使用的时候还是会new一个特定数据库的DAO 层,这无形中也与特定的数据库绑定了,虽然我们可以使用抽象工厂模式来获取DAO实现类,但除非我们一次性把所有数据库的DAO写出来,否则在进行数据库 迁移的时候我们还是得修改DAO工厂类,所以我们就思考新的方法

b:

1 public class Hello implements IHello {
2
3     public void sayHello(String name) {
4         // TODO Auto-generated method stub
5         System.out.println("Hello " + name);
6     }
7
8 }

如上图,假设我们要在方法的开始和结束处加上一些业务逻辑,大家想到的最直接的方法,就是在方法前面和后面加上一些代码,如日志,假如不能改变原来的方法了,那你又会想到继承Hello类,重写sayHello方法,如下

public class Hello2 extends Hello {public void sayHello(String name) {// TODO Auto-generated method stubsysstem.out.println("方法前的逻辑");super.sayHello("。。。。。。");}}

可能你又会想到,组合的方式

public class Hello3 implements IHello {private IHello helloDao =  new Hello();public void sayHello(String name) {// TODO Auto-generated method stubsysstem.out.println("方法前的逻辑");helloDao .sayHello("。。。。。。");}}

假设现在要把这个日志功能加入到20个不同方法的前面,可以考虑把那个日志功能抽离出来封装成一个类的方法,但是那样还是要组合新建20个类,组合20次,如下

public class LogInterceptor {public void before() {System.out.println("method before");}
}public class Hello3 implements IHello {private IHello helloDao =  new Hello();public void sayHello(String name) {// TODO Auto-generated method stubnew LogInterceptor().before();helloDao .sayHello("。。。。。。"); }
}public class hello4 implements 其他接口 {//需要新建类private IHello qitaDao =  new 其他业务类();//需要组合旧的类public void doHello(String name) {// TODO Auto-generated method stubnew LogInterceptor().before();helloDao .sayHello("。。。。。。"); }
}。。。20次

这样肯定不可靠。我们想新的思路,可以写一个配置文件,在每个需要加日志逻辑的里面,例Hello类的所有方法上配上那个日志类的方法,这样就不用新建20个类,组合20次旧的类,但是问题又来了,程序不会返回你重新组合的那个类(即那个新组合而成的动态类),我们需要思考新的方法

关于2:

IOC:Inversion of Control 控制反转,也叫(Dependency Injection)依赖注入,上述a的逻辑使用IOC,就是DAO接口的实现不再是业务逻辑层调用工厂类去获取,而是通过容器(spring)来自动的为我们的业务层设置DAO的实现类,这样整个过程就反过来,以前是我们业务层主动去获取DAO,而现在是DAO主动被设置到业务逻辑层中来了,这也就是反转控制的由来。通过IOC,我们就可以在不修改任何代码的情况下,无缝的实现数据库的换库迁移

AOP:Aspect Oriented Programming 面向切面编程,上述b的逻辑就使用AOP,就可以解决,他帮助我们生成动态的代理类,织入新的业务逻辑,如事务,日志等等

关于3:

IOC原理:

View Code

AOP原理:

View Code

运行结果:

开始了--Hello 张三
结束了--开始了--李四 GoodBye!
结束了--

转载于:https://www.cnblogs.com/baiduligang/p/4247354.html

spring - ioc和aop相关推荐

  1. 自己动手实现的 Spring IOC 和 AOP - 下篇

    1. 背景 本文承接上文,来继续说说 IOC 和 AOP 的仿写.在上文中,我实现了一个很简单的 IOC 和 AOP 容器.上文实现的 IOC 和 AOP 功能很单一,且 IOC 和 AOP 两个模块 ...

  2. 自己动手实现的 Spring IOC 和 AOP - 上篇

    1. 背景 我在大四实习的时候开始接触 J2EE 方面的开发工作,也是在同时期接触并学习 Spring 框架,到现在也有快有两年的时间了.不过之前没有仿写过 Spring IOC 和 AOP,只是宏观 ...

  3. Spring IoC 和 AOP

    Spring IoC 和 AOP spring框架java开发的行业标准. spring全家桶. Web:Spring Web MVC/Spring MVC,Spring Web Flux 持久层:S ...

  4. 【Spring 源码阅读】Spring IoC、AOP 原理小总结

    Spring IoC.AOP 原理小总结 前言 版本约定 正文 Spring BeanFactory 容器初始化过程 IoC 的过程 bean 完整的创建流程如下 AOP 的过程 Annotation ...

  5. 浅谈 Spring IOC和AOP

    浅谈 Spring IOC和AOP IOC 控制反转 以前创建对象的主动权和时机是由于自己把握的,现在将这种权利转移到Spring容器中,并且根据配置文件去创建对象管理对象 ioc的注入方式有三种:构 ...

  6. BeanPostProcessor —— 连接Spring IOC和AOP的桥梁

    之前都是从大Boss的视角,来介绍Spring,比如IOC.AOP. 今天换个视角,从一个小喽啰出发,来加深对Spring的理解. 这个小喽啰就是, BeanPostProcessor (下面简称 B ...

  7. Spring IOC 和 AOP 概览

    IOC(控制反转) IoC(Inversion of Control,控制倒转).所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系. 在没有IOC时,我们 ...

  8. 再品Spring Ioc 和 Aop

    文章目录 Spring好处 IOC 基于XML和基于注解开发 基于XML开发 基于注解开发 配置类 扫包+注解 依赖注入 AOP 写在前面,这篇文章写的时候我的SSM已经学过一遍了,回头来看真的受益匪 ...

  9. 吊打面试官系列之--吃透Spring ioc 和 aop (中)

    目录 Spring SpringBean的五个作用域 SpringBean的生命周期 创建过程 销毁过程 AOP的介绍和使用 AOP的介绍 AOP的三种织入方式 操作讲解 AOP的主要名词概念 Adv ...

最新文章

  1. .NET(C#)连接各类数据库-集锦
  2. jetson nano 用 tensorrt 运行 nanodet(kitti数据集)
  3. 混合密度网络(MDN)进行多元回归详解和代码示例
  4. 统计分析与spss的应用第五版数据_#统计分析与SPSS应用# 4.1.3 SPSS频数分析的扩展功能...
  5. 最终的动画函数封装(2)
  6. ERP CRM与SCM整合过程中的知识转移
  7. AS(Autonomous System)
  8. Science:这种算法,也许将创造更公平的人工智能
  9. 一般的模式匹配算法(求子串位置)
  10. springboot整合多数据源
  11. 表贴电阻尺寸与什么有关_什么是LED点光源屏?常见的LED点光源规格和型号
  12. 【进阶修炼】——改善C#程序质量(4)
  13. installshield使用教程
  14. Linux服务器上修改深度学习代码
  15. 学it需要学历吗_学IT需要什么学历
  16. (转载)Windows文件系统过滤驱动开发教程
  17. 速学TypeScript-精简划重点手册-下册
  18. The package javax.swing is not accessible错误的三种解决办法,亲测有效
  19. 三维叉乘怎么算_小学数学心算速算:多位数乘一位数
  20. 旋转矩阵列向量的物理含义

热门文章

  1. 简单粗暴Tensorflow 2.0
  2. winapi里的createthread函数 和linux,Windows API---CreateThread函数
  3. NLP︱高级词向量表达(二)——FastText(简述、学习笔记)
  4. 关系网络理论︱细讲中介中心性(Betweeness Centrality)
  5. python爬取公众号,用最简单的方式爬虫
  6. 红帽专家谈 Ceph 与 Gluster 开源存储路线
  7. php连接Access实例
  8. ViT (Vision Transformer) ---- SimpleRNN + Attention
  9. 同一个事务里面对同一条数据做2次修改_MySQL事务与MVCC如何实现的隔离级别
  10. python生成的字符画怎么查看_通过python将图片生成字符画