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代理机制:对类生成代理
想要弄明白,可以去看动态代理相关的知识。