Spring IOC 和AOP 简单理解
IOC:控制反转。
中文太差,根本看不出来是啥意思。
不过,它有作用,作用:可以实现完全的面向接口编程。
这句话中文倒是看得出来,实现面向接口编程。
但面向接口编程是什么? 不知道。
接口编程呢。
嗯,大概知道,应该是这样的吧。
//这是接口
public interface Office{
public void show();
}
// 这是编程 word、pdf、excel 实现接口office的功能
public class Word implements Office{
@Override
public void show() {
System.out.println("I'm word");
}
}
public class Pdf implements Office{
@Override
public void show() {
System.out.println("I'm Pdf");
}
}
public class Excel implements Office{
@Override
public void show() {
System.out.println("I'm Excel");
}
}
所以,这是接口编程吧。
再加上在主函数中使用类的功能。
public static void main(String [] args){
Office t1 = new Word();
t1.show();
Office t2 = new Pdf();
t2.show();
Office t3 = new Excel();
t3.show();
}
}
这样就完全了,可以分别使用word,pdf,excel的功能了。
但每使用一个功能,就得新建一个对象,功能多了,新建对象就麻烦了。
所以,为了减少麻烦,理论上就得使用一个对象,然后将这些东西装载进去。
于是,就建立了一个测试实体类,set用于装载对象,get用于测试功能。
public class Test {
private Office office = null;
public void setOffice(Office office){
this.office = office;
}
public void getOffice(){
office.show();
}
然后
public static void main(String [] args){
Test t = new Test(new Word());
t.getOffice();
}
这样就只需要建立一个对象,使用其实现类的功能了。
但是这样还是有麻烦,如果要改变实现类的功能的话。
Test t = new Test(new Word()); 就要换成 Test t = new Test(newPdf());
虽然看起来挺简单的,但是在主函数中改变代码,会有许多的不便。
万一名字看错了,怎么办? 万一主程序不能查看,怎么办?
于是有没有一种,不用在主函数中修改代码,直接改变功能的东西。
所以,IOC就出来了,它在中间加了个配置文件,主函数用的是配置文件里面的东西,引用的是配置文件的路径。
主函数 -> 配置文件 ->实现代码1
主函数(不变) -> 配置文件(改变指向代码的路径) ->实现代码2
只需要修改配置文件里面的代码引用路径就可以修改主函数中的功能实现了。
所以,IOC彻底解决这种代码之间耦合,它把耦合从代码中移出去,放在了配置文件中解决。
可以说是,实现了完全的接口编程。
而你只需要对着接口进行修改编程接口的实现类,不用管主程序中的东西,就可以实现各种各样的功能了。
所以这就是面向接口编程。
所以作用就是:可以实现完全的面向接口编程。
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
AOP:面向切面编程。
百度一下,什么是面向切面编程。
这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
简单来说,就是在编程写完后,对象都建好了,类都写完了,突然忘记了写某些东西,但是已经不能再修改类和方法了,不能再添加功能了。这时怎么办?只能在运行时,强行将一些代码加到那些类的方法上面,让对象强行做某些事情。
当然,如果是在编译时,你可以修改代码,修改类型,修改东西。
但是,许多类都有通用的方法,例如,学生、老师、校长都要在中午吃饭,但得有个前提,那就是到了中午的时候。
如果在编译时,你可以为学生老师校长都提供一个方法,这个方法就是让他们在上课时(运行时)看看有没有到中午,到了中午就执行吃饭的方法。
可是这样挺麻烦的。编译人员得写许多代码。而且现实中,校长也不满意(这样会分散学生的注意力)。
为什么不直接建立一个校铃,到了中午就打铃,然后他们就吃饭,这样多简单啊。
所以这个前提,就是这个切入点。
要执行的方法,就是这个切面。
在业务工作中,一般都是在访问什么什么的时候前加入权限控制,或者在执行什么什么方法的时候前加入日志记录,这样的。
比如,某人访问某网站。打开这个网址,这个就是前提,就是切入点,判断他有没有权限进入(游客或者会员),就是切面。
写些判断方法,然后插入到这个切入点,就面向切面编程。
这样方便控制和管理。
而Spring AOP 底层原理主要是 代理模式机制
JDK动态代理:对实现了接口的类生成代理
CGLib代理机制:对类生成代理
想要弄明白,可以去看动态代理相关的知识。
Spring IOC 和AOP 简单理解相关推荐
- Spring框架:谈谈对IOC和AOP的理解
在java面试中,如果我们被问及Spring框架的相关问题,那么一定避不开对Spring中的IOC和AOP的理解和使用,本文就简单谈论对于Spring中IOC和AOP的理解. 一.IOC的理解 1.1 ...
- 自己动手实现的 Spring IOC 和 AOP - 下篇
1. 背景 本文承接上文,来继续说说 IOC 和 AOP 的仿写.在上文中,我实现了一个很简单的 IOC 和 AOP 容器.上文实现的 IOC 和 AOP 功能很单一,且 IOC 和 AOP 两个模块 ...
- 自己动手实现的 Spring IOC 和 AOP - 上篇
1. 背景 我在大四实习的时候开始接触 J2EE 方面的开发工作,也是在同时期接触并学习 Spring 框架,到现在也有快有两年的时间了.不过之前没有仿写过 Spring IOC 和 AOP,只是宏观 ...
- Spring IoC 和 AOP
Spring IoC 和 AOP spring框架java开发的行业标准. spring全家桶. Web:Spring Web MVC/Spring MVC,Spring Web Flux 持久层:S ...
- 【Spring 源码阅读】Spring IoC、AOP 原理小总结
Spring IoC.AOP 原理小总结 前言 版本约定 正文 Spring BeanFactory 容器初始化过程 IoC 的过程 bean 完整的创建流程如下 AOP 的过程 Annotation ...
- 浅谈 Spring IOC和AOP
浅谈 Spring IOC和AOP IOC 控制反转 以前创建对象的主动权和时机是由于自己把握的,现在将这种权利转移到Spring容器中,并且根据配置文件去创建对象管理对象 ioc的注入方式有三种:构 ...
- IOC和AOP概念理解
IOC和AOP概念理解总结: IOC:控制反转 是一种降低对象之间耦合关系的设计思想,面试的时候最好能说出来个例子,加深理解.例子:租房子,以前租房子需要一个房子一个房子找,费时费力,然后现在加入一个 ...
- 抛弃隐晦,明了的理解Spring IOC与AOP
IOC(反转控制) 一个java应用程序是有很多类组成的,这些类相互协作.相互作用来提供应用程序的表现行为.那些被其它类组合提供某些行为的类,称之为其它类的依赖(dependencies).利用软件工 ...
- 深入理解Spring IOC和AOP
文章目录 1. 什么是 Spring 框架? 1.1Spring简介 1.2Spring的好处 1.3Spring体系结构 2.理解Spring IoC 2.1IoC简介 2.2IoC的好处 2.3依 ...
最新文章
- 人脸检测算法_目前最强!开源人脸检测算法:RetinaFace
- js javascript 实现多线程
- ajax使用json数组,使用JSON传递数组值的Ajax
- Ping CAP CTO、Codis作者谈redis分布式解决方案和分布式KV存储
- python django admin.site.register注册应用
- Maven 项目创建 找不到web.xml
- oracle 安装ora 27102,ORA-27102 解决办法
- 交叉路口红绿灯控制程序linux,西门子PLC编程实例详解|十字路口交通灯自动控制系统...
- php打开word文件怎么打开,docx文件怎样打开
- static,entern函数的用法;#define定义符号和宏
- 车辆出险理赔记录接口文档
- 用JavaScript实现,用户输入自己的汽油编号,然后输入自己加多少升,就弹出价格
- 解决mysql保存数据SQLException: Incorrect string value: ‘\xF0\x9F\x91\x87\xE5\x91...‘ for column ‘错误
- 【豌豆荚 360助手】发布第一个私人项目
- GUVB-T11GD-L 太阳光紫外线传感器TO-46韩国GenUV光电二极管杀菌灯监控
- 大厂机密!乔戈里在BAT大厂都用些什么?大揭秘
- 用js给自己照相并修图
- 华三交换机IRF:2台交换机+BFD方式MAD监测
- 格雷希尔快速连接器GripSeal 密封性测试密封堵头 G15Pro系列使用说明
- 新款M2 MacBook Pro电脑--我们将其与M1版进行比较