开始学spring时,spring两大特性IOC 和AOP ,ioc的解释是:
IoC (Inversion of Control) 中文译为控制反转 又称为“依赖注入”(DI =Dependence Injection)
IOC的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器负责将这些联系在一起。
其原理是基于OO设计原则的The Hollywood Principle:Don't call us, we'll call you(别找我,我会来找你的)。也就是说,所有的组件都是被动的(Passive),所有的组件初始化和调用都由容器负责。组件处在一个容器当中,由容器负责管理。
简单的来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。AOP的解释是:
面向切面编程:Aspect Oriented Programming
AOP是OOP的延续,是(Aspect Oriented Programming)的缩写,意思是面向切面编程。
主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。
主要的意图是:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。
在Spring中提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
上面这些概念都是我们开始学的时候,的一些理论知识,其实刚开始谁也不会完全懂这些。本篇文章主要解释IOC,对AOP只是介绍下。扯远点,谈谈面向对象和面向过程。为什么面向对象优于面向过程。其实就是在软件开发的过程中,软件变化的地方越来越多。各种各样的变化。导致用传统面向过程的设计。并不能适应软件变化越来越多。变的越来越庞大的需求。面向过程的程序设计方法并不是不好。如果我们的软件一开发出来就定型了,没有变化升级 了,我个人觉得面向对象和面向过程在某些方面应该没有区别,面向对象的优点就是它对应于软件开发过程中的变化,能够比面向过程更好的适应。更好的扩展系统。来适应变化。我觉得一句话概括:面向对象比面向过程能更好的适应变化,其实包含本篇讲的IOC,也是这样。如果软件开发中没有变化,IOC也就没有什么用。包括设计模式。AOP,软件的模式等等。我们首先要学会对比分析。首先要学会假设,学会假设需求的变化。这样才能更好的理解设计模式。IOC,AOP等这些经典的思想。扯远了,回到本文的讨论。举个例子。下面例子一步步的变化。注意变化后与上次对比,
好在哪里。这样我们才能够更好的理解IOC思想。举一个人去北京,他可以坐火车,汽车,飞机等工具的例子。类如下:
class Car{
public void run(){
System.out.println("-----------by Car-----------");
}
}
class Person{
public void goToBJ(){
Car car=new Car();
car.run();
}
}
public class Client(){
public static void main(String args[]){
Person person=new Person()
person.goToBJ();
}
}
这是一个人坐汽车去北京的例子。当然这个人如果一直坐汽车去北京。没有什么事。他某天突然想坐火车去北京。那我们首先必须先增一个火车类。当然这个是必须的,也是
正确的,OCP原则,对扩展开放,对修改关闭。我们现在要新增功能,新增一个类是必须的。(这里我强调一下,是避免疑问),我们新增火车类后,发现我们还得必须修改我们
的Person类。这点是非常不好的。这也是我们所关注的地方。我们强调对修改关闭。我们应该尽量减少对我们类的修改。这里我们重构一下代码。新增一个工具接口。用接口来实现。
class Person{
private GongJu gongju;
public Person(GongJu gongju){//这里类似于IOC里面的构造注入。
this.gongju=gongju;
}
public void goToBJ(){
gongju.run();
}
}
Class Car implements GongJu{
public void run(){
System.out.println("-----------by Car-----------");
}
}
//新增的火车类
Class HuoChe implements GongJu{
public void run(){
System.out.println("-----------by HuoChe -----------");
}
}
//工具接口
public interface GongJu{
public void run();
}
public Class Client(){
public static void main(String args[]){
GongJu gongju=new Car();//在这里变化。如果想坐火车,变成这样 GongJu gongju=new HuoChe();即可
Person person=new Person(gongju);
person.getToBJ();
}
}
通过重构后的代码,我们发现可扩展性,得到了极大的提高。以后人要是想坐飞机等其他方式去北京。我们只要新增一个类,实现GongJu接口。再在客户端稍微修改一下。不用去修该已有的代码。可维护性得到很大的提高。我们再次重构代码,新增一个工厂类。把客户端类的代码移到工厂类中去。变化如下:
class Factroy{
public void BJ(){
GongJu gongju=new Car();
Person person=new Person(gongju);
person.getToBJ();
}
}
public Class Client {
Factory factory =new Factory();
factory.BJ();
}
在这里我们通过Factory类的依赖注入,实现了反转控制。以后需求的任何变化,我们只用关注工厂类的变化即可。当然修改代码对于我们来说始终是不太好。在这种情况是spring提出了一种比较好的更改方式。通过配置xml文件来实现依赖注入。以后我们修改只要修改xml文件即可。目前spring支持3中注入。包括set 注入。构造器注入,接口注入等,spring里面有个BeanFactory类。类似我们这里的Factory类。spring IOC的具体实例在这里不在详细描述了,对于IOC我的理解是它将类与类之间的依赖关系转移了。即所谓的好莱坞原则。(Don't call me ,I'll call you!)一般情况下。我们要使用实例时。需要创建对象的实例。然而通过我们的IOC容器框架后。我们只需要直接使用实例。将创建对象的任务交给IOC容器。这就是IOC。
分享到:
相关推荐
在IT行业中,依赖注入(IOC,Inversion of Control)是一种设计模式,它使得应用程序的组件之间解耦,...同时,这也是一种提升编程技能的好方式,因为它鼓励我们思考和实现设计模式,而不是仅仅依赖现成的库或框架。
我们先来实现IoC也就是管理Bean的这套模式,我们先来说说这套程序应该怎么做,对于IoC的入门案例,首先我们需要思考以下问题。 第一个问题,管理什么? 也就是我的Spring容器(也就是IoC容器,以下我们都称为Spring...
而掌握IOC的唯一方法就是使用和思考。 Spring是IOC为核心的,所以第一步就是要深刻理解IOC,最好是能尽快把IOC作为教条式的原则,虽然有些偏激,但有助于尽快理解,在你有了深刻的理解之后,你再看Spring就已经有个...
而掌握IOC的唯一方法就是使用和思考。 Spring是IOC为核心的,所以第一步就是要深刻理解IOC,最好是能尽快把IOC作为教条式的原则,虽然有些偏激,但有助于尽快理解,在你有了深刻的理解之后,你再看Spring就已经有个...
“有生命、会思考”的智慧城市,是信息技术与城市管理深度融合的产物,它借助互联网、物联网、大数据、人工智能等先进技术,打造了一种新型的城市治理模式。这种模式不仅能够对城市运行的各种数据进行实时监控和分析...
- Spring IoC学习:包括依赖注入(DI)、控制反转(IoC)和自动装配等概念的学习,这部分是框架入门的关键。 - Spring AOP学习:介绍面向切面编程的概念,帮助学生掌握如何在Spring框架中运用AOP来处理业务逻辑。 - ...
首先,Spring的核心在于IoC(Inversion of Control,控制反转)。IoC容器是Spring框架的心脏,负责管理对象的生命周期和依赖关系。当一个类的实例需要其他类的服务时,通常由IoC容器负责创建这些依赖对象并注入到...
### Spring源代码自我解析 #### 一、Spring框架概述与价值 Spring框架作为一个全面的轻量级企业级应用...学习Spring源码不仅能帮助开发者更好地利用框架提供的功能,还能激发他们对于设计模式和编程技巧的深入思考。
在华为的智慧城市建设实践中,智能运营中心(IOC)扮演着核心角色。智能运营中心是城市运行管理的大脑和中枢,它通过汇集各种数据,实现城市运行的可视化,提高应急处理能力,促进决策的科学性和智能化。例如,智能...
本教学资料“基于SSM框架的Java Web开发课程教学中的几点思考”探讨了如何有效地教授和学习这些关键技术,以及如何将它们整合到实际项目中。以下是对该主题的详细阐述: 首先,Spring框架是Java应用程序的核心管理...
它们可能涵盖了作者在阅读和分析源码过程中的思考、关键代码的解释以及设计模式的应用。这些笔记可以帮助我们更有效地学习Spring的内部工作机制,加深对其设计理念的理解。 总之,Spring 4.2.4源码是一个深入研究和...
### 开源协作学习环境Sakai的学习与思考 #### Sakai起源、现状和发展 ##### 起源 Sakai项目起始于2004年,由美国的印第安纳大学、密歇根大学、斯坦福大学以及麻省理工学院共同发起。这四个高等教育机构联手启动了...
【思考题解析】 对于接口ValidateUser,有两个实现类CheckUser1和CheckUser2,分别实现了XML验证和数据库验证。通过Spring的DI,可以根据需求动态选择注入CheckUser1或CheckUser2,这样就可以灵活地在不同场景下...
- **不是替代现有设计观念**:控制反转是作为现有设计方法的补充,特别是在模块重用和系统集成时,它提供了一种新的思考角度。 - **指定引用关系**:通过控制反转,可以将多个组件编织在一起,形成工作流程,提高...
Spring框架是Java开发中广泛应用的一个开源框架,以其强大的依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-...记得在实践中不断思考,将理论知识与实践相结合,这样才能真正掌握Spring的魅力所在。
"spring-in-thinking"这个标题暗示了我们正在深入探讨Spring框架的各个方面,而"在春天思考"可能是指在编程和设计模式上进行创新与深化理解的过程。"spring全家桶"一词通常用来形容Spring框架的众多组件和扩展,包括...
如果你正在思考下面这些问题,也许《Spring技术内幕:深入解析Spring架构与设计原理》就是你想要的! 掌握Spring的架构原理与设计思想真的能让开发者如虎添翼吗? IoC容器如何掌控以POJO为基础的Bean对象?它...
如果你正在思考下面这些问题,也许《Spring技术内幕:深入解析Spring架构与设计原理》就是你想要的! 掌握Spring的架构原理与设计思想真的能让开发者如虎添翼吗? IoC容器如何掌控以POJO为基础的Bean对象?...
如果你正在思考下面这些问题,也许《Spring技术内幕:深入解析Spring架构与设计原理》就是你想要的! 掌握Spring的架构原理与设计思想真的能让开发者如虎添翼吗? IoC容器如何掌控以POJO为基础的Bean对象?它...
如果你正在思考下面这些问题,也许《Spring技术内幕:深入解析Spring架构与设计原理》就是你想要的! 掌握Spring的架构原理与设计思想真的能让开发者如虎添翼吗? IoC容器如何掌控以POJO为基础的Bean对象?...