| 分离关注( Separation of Concerns : SOC)是Ioc模式和AOP产生最原始动力,通过功能分解可得到关注点,这些关注可以是 组件Components, 方面Aspects或服务Services。 从GoF设计模式中,我们已经习惯一种思维编程方式:Interface Driven Design 接口驱动,接口驱动有很多好处,可以提供不同灵活的子类实现,增加代码稳定和健壮性等等,但是接口一定是需要实现的,也就是如下语句迟早要执行: AInterface a = new AInterfaceImp(); AInterfaceImp是接口AInterface的一个子类,Ioc模式可以延缓接口的实现,根据需要实现,有个比喻:接口如同空的模型套,在必要时,需要向模型套注射石膏,这样才能成为一个模型实体,因此,我们将人为控制接口的实现成为“注射”。 Ioc英文为 Inversion of Control,即反转模式,这里有著名的好莱坞理论:你呆着别动,到时我会找你。 其实Ioc模式也是解决调用者和被调用者之间的一种关系,上述AInterface实现语句表明当前是在调用被调用者AInterfaceImp,由于被调用者名称写入了调用者的代码中,这产生了一个接口实现的原罪:彼此联系,调用者和被调用者有紧密联系,在UML中是用依赖 Dependency 表示。 但是这种依赖在分离关注的思维下是不可忍耐的,必须切割,实现调用者和被调用者解耦,新的Ioc模式 Dependency Injection 模式由此产生了, Dependency Injection模式是依赖注射的意思,也就是将依赖先剥离,然后在适当时候再注射进入。 Ioc模式(Dependency Injection模式)有三种: 第一种类型 从JNDI或ServiceManager等获得被调用者,这里类似ServiceLocator模式。 1. EJB/J2EE 2. Avalon(Apache的一个复杂使用不多的项目) 第二种类型 使用JavaBeans的setter方法 1. Spring Framework, 2. WebWork/XWork 第三种类型 在构造方法中实现依赖 1. PicoContainer, 2. HiveMind 有过EJB开发经验的人都知道,每个EJB的调用都需要通过JNDI寻找到工厂性质的Home接口,在我的教程EJB是什么章节中,我也是从依赖和工厂模式角度来阐述EJB的使用。 在通常传统情况下,为了实现调用者和被调用者解耦,分离,一般是通过工厂模式实现的,下面将通过比较工厂模式和Ioc模式不同,加深理解Ioc模式。 工厂模式和Ioc 假设有两个类B 和 C:B作为调用者,C是被调用者,在B代码中存在对C的调用: public class B{ private C comp; ...... } 实现comp实例有两种途径:单态工厂模式和Ioc。 工厂模式实现如下: public class B{ private C comp; private final static MyFactory myFactory = MyFactory.getInstance(); public B(){ this.comp = myFactory.createInstanceOfC(); } public void someMethod(){ this.comp.sayHello(); } ...... } 特点: 每次运行时,MyFactory可根据配置文件XML中定义的C子类实现,通过createInstanceOfC()生成C的具体实例。 使用Ioc依赖性注射( Dependency Injection )实现Picocontainer如下,B类如同通常POJO类,如下: public class B{ private C comp; public B(C comp){ this.comp = comp; } public void someMethod(){ this.comp.sayHello(); } ...... } 假设C接口/类有有一个具体实现CImp类。当客户端调用B时,使用下列代码: public class client{ public static void main( String[] args ) { DefaultPicoContainer container = new DefaultPicoContainer(); container.registerComponentImplementation(CImp.class); container.registerComponentImplementation(B.class); B b = (B) container.getComponentInstance(B.class); b.someMethod(); } } 因此,当客户端调用B时,分别使用工厂模式和Ioc有不同的特点和区别: 主要区别体现在B类的代码,如果使用Ioc,在B类代码中将不需要嵌入任何工厂模式等的代码,因为这些工厂模式其实还是与C有些间接的联系,这样,使用Ioc彻底解耦了B和C之间的联系。 使用Ioc带来的代价是:需要在客户端或其它某处进行B和C之间联系的组装。 所以,Ioc并没有消除B和C之间这样的联系,只是转移了这种联系。 这种联系转移实际也是一种分离关注,它的影响巨大,它提供了AOP实现的可能。 Ioc和AOP AOP我们已经知道是一种面向切面的编程方式,由于Ioc解放自由了B类,而且可以向B类实现注射C类具体实现,如果把B类想像成运行时的横向动作,无疑注入C类子类就是AOP中的一种Advice,如下图: ![]() 通过下列代码说明如何使用Picocontainer实现AOP,该例程主要实现是记录logger功能,通过Picocontainer可以使用简单一行,使所有的应用类的记录功能激活。 首先编制一个记录接口: public interface Logging { public void enableLogging(Log log); } 有一个LogSwitcher类,主要用来激活具体应用中的记录功能: import org.apache.commons.logging.Log; public class LogSwitcher { protected Log m_log; public void enableLogging(Log log) { m_log = log; m_log.info("Logging Enabled"); } } 一般的普通应用JavaBeans都可以继承这个类,假设PicoUserManager是一个用户管理类,代码如下: public class PicoUserManager extends LogSwitcher { ..... //用户管理功能 } public class PicoXXXX1Manager extends LogSwitcher { ..... //业务功能 } public class PicoXXXX2Manager extends LogSwitcher { ..... //业务功能 } 注意LogSwitcher中Log实例是由外界赋予的,也就是说即将被外界注射进入,下面看看使用Picocontainer是如何注射Log的具体实例的。 DefaultPicoContainer container = new DefaultPicoContainer(); container.registerComponentImplementation(PicoUserManager.class); container.registerComponentImplementation(PicoXXXX1Manager.class); container.registerComponentImplementation(PicoXXXX2Manager.class); ..... Logging logging = (Logging) container.getComponentMulticaster(); logging.enableLogging(new SimpleLog("pico"));//激活log 由上代码可见,通过使用简单一行logging.enableLogging()方法使所有的应用类的记录功能激活。这是不是类似AOP的advice实现? 总之,使用Ioc模式,可以不管将来具体实现,完全在一个抽象层次进行描述和技术架构,因此,Ioc模式可以为容器、框架之类的软件实现提供了具体的实现手段,属于架构技术中一种重要的模式应用。J道的JdonSD框架也使用了Ioc模式 | <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript> </script> |
相关推荐
用C++从零复刻Wordle:手把手教你实现命令行猜词游戏(含完整源码解析)
本文详细介绍了如何使用C++从零开始实现一个命令行版本的Wordle猜词游戏,包含完整的源码解析和核心模块设计。通过游戏逻辑控制器、单词库管理器等模块的构建,开发者可以学习C++实战技巧和性能优化方法,适合提升编程能力和游戏开发兴趣。
IOC模式理解
理解IOC inversion of control 控制反转 与 DI Dependency Injection 依赖注入概念之前,我们需要知道在一个系统的设计过程中,降低各模块之间的相互依赖,达到高内聚低耦合,是判断设计好坏的标准; 所以Robert Martin大师提出了面向对象设计原则----依赖倒置原则: A. 上层模块不应该依赖于下层模块,它们共同依赖于一个抽
AI大模型开发——transformer模型超全完整版(0基础可懂)
为了更深入的了解transformer模型,我们首先从transformer的诞生聊起吧。transformer在2017年由Vaswani等人首次提出,它摒弃了之前流行的循环神经网络和卷积神经网络的架构,引入了自注意力机制( Self-Attention),显著提高了处理序列数据的能力和效率。transformer模型的这种设计使其在处理长距离依赖问题时, 相比于传统的循环神经网络和长短期记忆网络(LSTM)表现得更加出色,至此, 开启了NLP技术的新篇章。
IOC设计模式
简介:
用Python的fengwo模块复刻通达信筹码峰(COST/WINNER),选股效率提升10倍
本文介绍了如何使用Python的fengwo模块高效复刻通达信的筹码峰(COST/WINNER)计算,显著提升选股效率。通过C++内核与多线程优化,fengwo模块将传统Python实现的数小时计算压缩至分钟级,解决了量化交易中的性能瓶颈问题。文章详细解析了筹码峰计算原理、fengwo模块的技术架构及实战应用,助力量化开发者构建高效选股系统。
2xmax96717+max96724+agx orin驱动代码
说明:这里主要解决max96717的设备地址和sensor地址映射,vc0->vc1多颗max96717+max96724使用配置思路如下: 1、改变max96717的pipez stream id,然后max96724的pipe绑定使用相应的stream id 2、max96717默认是vc0,把vc0改写成vc1\vc2\vc3,然后max96724再重新映射vc输出
设计模式实践——IOC模式
IOC模式 又被称为依赖倒置模式。它将原本调用者类+功能类 的耦合关系改成 调用者类+中间类、中间类+功能类。
QGis软件 —— 1、Windows10下载安装QGis及插件
QGis —— 1、Windows10下载安装QGis及插件
IoC模式的类型及其实现
1引言 面向对象的思想已经深入人心,但是要利用面向对象的思想开发出优秀的应用程序却不是一件容易的事情。正是基于面向对象的思想,人们对各种应用程序进行了大量的分析、总结、归纳出了设计模式。Alexanders给出模式的经典定义是:每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需再重复相同的工作[2]
把复杂计算推到数据库里:ABAP CDS View Table Function 从原理到落地实践
摘要:本文深入解析ABAP CDS Table Function技术,重点探讨其在复杂业务场景下的应用价值。当CDS View无法满足窗口函数、递归计算等高级需求时,Table Function通过结合CDS类型系统与AMDP的数据库原生计算能力,成为关键解决方案。文章详细介绍了Table Function的架构设计(CDS实体声明+AMDP实现)、客户端处理机制、开发传输流程中的注意事项,并通过航班数据示例展示最小实现闭环。这项技术特别适用于需要将复杂计算下推到数据库层的场景,能显著提升RAP和OData
Python实战:打造学生信息管理系统
通过本教程,我们构建了一个简单的学生信息管理系统,实现了基本的添加、删除、修改和查询功能。当然,这个系统还有很多可以改进和扩展的地方,比如添加用户界面、增加数据持久化功能、支持批量操作等。简介:本文将介绍如何使用Python编写一个功能齐全的学生信息管理系统,包括添加、删除、修改和查询学生信息的基本操作。学生信息管理系统是学校日常管理中不可或缺的一部分,它能够帮助管理人员快速、准确地管理学生信息,提高工作效率。为了实现上述功能,我们可以设计一个包含学生信息的字典,并使用函数来封装各个操作。
Ioc模式
Ioc模式 板桥里人 http://www.jdon.com 2004/01/31 分离关注( Separation of Concerns : SOC)是Ioc模式和AOP产生最原始动力,通过功能分解可得到关注点,这些关注可以是 组件Components, 方面Aspects或服务Services。 从GoF设计模式中,我们已经习惯一种思维编程方式:Interface Driven De
AE(自动曝光)调试策略:曝光曲线设计与过曝控制
自动曝光(AE, Auto Exposure)系统是图像质量控制链路中的核心模块之一,其性能直接决定了成像亮度是否稳定、细节是否完整、场景切换是否自然。在现代移动终端影像系统中,AE 不仅需要适应不同光照强度和复杂环境,还需兼顾人脸优先、HDR触发、视频帧率控制等多目标优化需求。本文基于高通 Snapdragon 和 MTK Dimensity 等主流平台的调试经验,系统梳理了 AE 模型设计原则、曝光曲线配置、测光策略选择与过曝抑制机制,并结合典型实战案例,提供可复制的工程落地路径。
单例模式详解:从设计模式到 Spring Boot IOC 的三层缓存机制全解析
单例模式是一种创建型设计模式,确保类只有一个实例并提供全局访问点,适用于日志管理、数据库连接池等场景。常见实现方式包括:饿汉式(类加载时创建)、懒汉式(延迟加载但线程不安全)、同步懒汉式(线程安全但性能差)、双重检查锁(兼顾性能与安全)、静态内部类(无锁且线程安全)和枚举单例(最安全但不支持延迟加载)。在Spring Boot中,单例通过三级缓存机制实现,能处理属性注入的循环依赖,但无法解决构造器注入的循环依赖问题。
STM32F407中文手册
STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。
C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片
基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正
【策略模式】最佳实践——Spring IoC实现策略模式全流程深度解析
策略模式是一种行为型设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换,并且使算法的变化不会影响使用算法的客户端。策略模式通过将具体的业务逻辑从上下文(Context)中剥离出来,独立为策略类,动态地将所需的行为注入上下文对象中,从而避免代码中充斥条件判断逻辑。
WINCC7.3破解文件
WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!
Spring IoC 容器中 XML 配置文件的验证模式解析:DTD 与 XSD 的选择与自动检测机制
Spring IoC容器在解析XML配置文件时支持DTD和XSD两种验证模式。本文分析了两种验证机制的区别:XSD基于XML语法,支持命名空间和丰富数据类型,是Spring 2.0+的默认选择;DTD则适用于早期简单配置。Spring通过XmlBeanDefinitionReader自动检测验证模式,主要依据XML文件是否包含<!DOCTYPE声明。文章还针对常见问题提供了解决方案,如XSD验证失败、混合使用验证模式、网络不可达及编码问题等。开发者应优先使用XSD验证以获得更好的类型安全和工具支持。
怀旧版电脑GBC模拟器
再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。
c# ioc 单例模式_解析C#设计模式之单例模式
单例模式(Singleton),故名思议就是说在整个应用程序中,某一对象的实例只应该存在一个。比如,一个类加载数据库中的数据到内存中以提供只读数据,这就很适合使用单例模式,因为没有必要在内存中加载多份相同的数据,另外,有些情况下不允许内存中存在多分份相同的数据,比如数据过大,内存容不下两份相同数据等等。约定单例模式(Singleton by Convention)这种方式有点“Too simple...
【Java设计模式】二十五、自定义Spring IoC
根据上面xml的特点,定义类,用于封装bean标签下的property标签的各个属性。property.name即对象的属性名property.ref即引用参考对象property.value即对象属性为基本类型或String时的赋的值//对象的属性名//引用参考对象//对象属性为基本类型或String时的赋的值return ref;一个bean标签可以有多个property子标签,一个property子标签对应一个PropertyValue对象,所以再定义一个。
解析Spring IOC原理——工厂模式与反射机制的综合应用
(一)工厂模式 从一个例子开始讲起: 首先我们建立一个Chinese.java类,该类的sayHelloWorld(String name)方法,用中文对名为name的人问好,其内容如下: public class Chinese { /**-- 用中文对某人问好. --*/ publicvoid sayHelloWorld(String name) {
深入解析控制反转(IoC)与依赖注入(DI)设计模式
控制反转(IoC)是一种重要的软件设计原则,它通过将对象创建和依赖管理的控制权从应用程序代码转移到专用容器,实现了组件间的松耦合。依赖注入(DI)作为IoC的主要实现方式,包括构造器注入、Setter注入等多种形式,每种方式都有其适用场景。在现代Java开发中,Spring框架的IoC容器通过Bean管理、依赖解析等核心功能,大幅提升了代码的可维护性和可测试性。这种设计模式特别适用于需要频繁修改或扩展的企业级应用,能够有效解决传统编程中的硬编码依赖问题。随着云原生和微服务架构的普及,IoC容器也在不断演进,
Spring IOC源码解析:parseCustomElement详解,C# 中的 简单工厂模式 (Simple Factory)。
以下演示如何实现一个自定义标签<my:user>1. 定义 XSD 文件2. 实现 NamespaceHandler@Override3. 注册 SPI 配置在。
j2ee核心模式_Spring 5 中文解析核心篇-IoC容器之IoC容器和Bean概述
关于本书本书本书编写主要目的在于翻译官方spring.io关于SpringFramework模块文档之核心篇,但是本书不仅仅是简单的翻译,我会根据相应的模块给出一些代码的操作实践以及给出相应的源码分析,SpringFramework文档我个人认为在所有开源框架中算是写得最好的了,But如果对于初学者或者是实践经验较少的小伙伴来说还是比较困难的。这里不仅仅是文档全是英文形式而且根据文档的概述是比较难...
Spring面试宝典:Spring IOC的执行流程解析
Spring IOC的工作流程解析:从配置到依赖注入,Spring容器通过控制反转机制自动管理对象的创建和依赖关系。核心流程包括解析配置生成BeanDefinition、注册到容器、反射实例化单例Bean、完成依赖注入等步骤,最终通过@Autowired或getBean()获取实例。这种设计降低了代码耦合度,提高了可维护性和扩展性,让开发者更专注于业务逻辑的实现。面试时可简明阐述这三个阶段,强调IOC带来的解耦优势。

333



被折叠的 条评论
为什么被折叠?



