我的一篇《
》(http://leospace.iteye.com/blog/973744)已经对单纯使用Coc的方式实现DI进行了讨论,并且实现了一个最简的实现,目的是排除其他约束干扰以便于验证可行性。但是这个实现并不能应用于实际的开发,因为它并不能更加适应于实际的情况。实际的情况是有很多接口依赖(比如一个属性的类型就是一个接口),这时这个实现根本无法确认使用这个接口实现的哪一个!另外也没有办法知道一个值类型的属性具体的值,只能给赋予0,而且都是基于属性注入的方式,不符合实际要求,也不太灵活。
所以逐步增加针对实际应用的支持是必要的.下图是按上篇中实现的简单工厂作为基础的,并实现了Coc和XML以及AOP的核心功能的库,这个库以后将做为一整套方案的基础核心,这个库暂时叫做Sim Object Builder
流程:
1) 当实例化SimApplicationContext时,传入一个预先配置好的XML配置文件(其中声明了对象的依赖关系),此时
当GetObject时,框架是按Coc(约定优于配置)+XML配置的方式进行的,首先构造按Coc解析出来而产生的ObjectDefinition, 然后在检查XML,如果发现有接口DI或者值的声明,那么框架自己自动合并XML产生的ObjectDefinition和Coc方式产生的ObjectDefinition.
如果实例化SimApplicationContext时,没有传入XML配置文件,那么直接使用Coc的方式产生ObjectDefiinition
2)框架在得到ObjectDefinition后,自动将其注册在ObjectDeifnitionStore中,以备以后重用(因为使用反射解析是需要花费不少时间的,所以缓存起来)。
3)框架开始调用DynaObjectTypeFactory的CreateType方法,根据ObjectDefinition的指示生成代理类型(使用Emit生成),但是它会根据是否需要生成代理类型而生成,含义是:一旦ObjectDefinition是指明至少一个方法有Advice(一个方面,AOP的一个方面实现,此框架用IAdvice表示),或者至少一个属性启动了延迟加载的功能,那么DynaObjectTypeFactory会采用生成代理类型的方式返回新的类型,否则直接返回一个目标类型(真实类型,不是代理的)。
4)然后框架开始调用BasicCocObjectFactory的GetObject方法,通过方法参数传入刚刚DynaObjectTypeFactory返回的Type,然后Coc使用反射递归地把各个对象包含依赖的对象全部实例化并组装在一起。
5)最后,将创建的“主”对象放到ObjectPoolService中(以便重用),并返回给客户端程序使用。
这里BasicCocObjectFactory就是前面一篇文章中描述和实现的那个简单Coc工厂,这个框架以此为基础进行拓展而形成的,BasicCocObjectFactory使用BasicObjectFactory实例化每一个依赖的对象和主对象。BasicObjectFactory是一个最最简单的对象工厂,也就是用反射工具把传进来的类型实例化了而已,不负责实例化依赖的对象。
另外,Type进行的缓存(并提供文件系统监视器,会自动刷新),使得解析过程的花费减到相对较低,下次调用GetObject时,实际上是使用缓存了ObjectDefinition和缓存了的Object实例。除非环境有变化,才会刷新缓存。
ApplicationContext采用了树型结构的管理,用以简化依赖配置的管理:子容器可以重用父容器的配置(子容器的XML配置文件越来越简单),GetObject方法能够在这个树里找到目标的Object.
值得注意的是,这个框架提供了很好的解耦,对于ObjectDefinition它并不关心依赖配置信息存在何处,是什么保存的(比如xml,txt,ini等等),它都能合并成ObjectDefinition,并且可以提供自己的资源访问器(自定义开发),并且对于DynaObjectTypeFactory而言只接受ObjectDefinition,那么就有效地隔离了资源的差一性,使用Meshup的办法来组合
ObjectDefinition,然后ObjectFactory只是简单实例化组装而已,并能提供基于代理的AOP和延迟加载能力。整个结构简单,概念一致。
这个代码已经完成了将近60%,我会在以后提供出来,协议为LGPL.同时提供Mono、.Net、Java的版本。
分享到:
相关推荐
JavaScript(简称JS)和WebView的交互是移动应用开发中的一...通过合理的交互设计,开发者可以构建出既美观又功能丰富的混合型移动应用。在实际项目中,可以根据需求调整和扩展这些基本交互机制,实现更多复杂的功能。
学习SQL语句、事务管理以及ORM(Object-Relational Mapping)工具,如Hibernate或MyBatis,能帮助开发者更好地管理和操作数据库。 七、安全与认证 理解HTTPS、SSL/TLS协议对于保证Web应用的安全至关重要。同时,...
IBM Db2 Big SQL 作为一种混合型、ANSI 标准兼容的数据虚拟化工具,能够跨企业访问、查询和汇总数据,它具备以下核心特性: #### IBM Db2 Big SQL 的关键特性: 1. **强大的 MPP 架构**:Db2 Big SQL 提供了一种大...
C++也支持过程化编程,因此它是混合型编程语言。 ### 2. 基本语法 C++的语法结构与C语言类似,但更严谨。基础包括变量定义、数据类型(如int, char, float, double等)、运算符(算术、比较、逻辑等)、控制结构...
在"基于应用型人才培养的Java EE课程建设与实施"这个主题中,我们可以探讨以下几个核心知识点: 1. **Java EE架构**:Java EE平台包含了一系列的服务器端组件和服务,如Servlet、JSP(JavaServer Pages)、EJB...
JSP则是一种视图技术,允许开发者用HTML语法混合Java代码,简化了页面的呈现逻辑。Servlet-JSP组合常用于实现MVC(Model-View-Controller)设计模式,提高了代码的组织性和可维护性。 2. **EJB(Enterprise ...
8. **容器服务ACK(Kubernetes)**:基于Kubernetes的容器服务,让企业可以轻松管理和扩展容器化应用。 9. **云原生**:包括云数据库、Serverless服务等,帮助企业在云上实现更高效、敏捷的开发和运维。 10. **...
6. **容器服务ACK(Kubernetes)**: 基于Kubernetes的容器服务,帮助企业轻松管理和部署容器化应用。 7. **大数据服务**: 包括MaxCompute(大数据处理平台)、QuickBI(数据分析工具)等,帮助企业挖掘数据价值。 ...
JDBC(Java Database Connectivity)API是Java连接数据库的标准接口,无论是关系型数据库还是非关系型数据库,都可以通过JDBC进行访问。同时,JPA(Java Persistence API)和Hibernate等ORM(Object-Relational ...
通过SOAP(Simple Object Access Protocol)或RESTful方式提供跨平台、跨语言的接口。 **9. 安全性** J2EE提供角色基础的权限管理,如Servlet和EJB的安全配置,以及HTTPS支持,保障应用安全。 **10. 部署与容器** ...
Java 是一种混合型语言,它首先被编译成字节码(.class 文件),然后这些字节码被JVM解释执行。这种机制既保证了编译型语言的性能优势,又具备了解释型语言的灵活性。 #### 3. C 语言的各种标识符是区分大小写字母...
4. **容器服务**:J2EE容器为应用提供了一系列服务,如安全性、事务管理、 ejb容器管理、生命周期管理等。这些服务使得开发者可以专注于业务逻辑,而不必关心底层实现细节。 5. **分布式特性**:J2EE支持RMI...
在Spring 3.1中,IoC容器的配置选项更加丰富,XML配置可以与注解配置混合使用,提供了更多灵活性。此外,Bean定义合并功能允许在多个配置文件间进行合并,使得大型项目管理更加方便。 2. **AOP(面向切面编程)**:...
相比之下,C++是建立在C之上的混合型语言,允许任意继承树,因此支持多重继承。Smalltalk的限制意味着在C++中常见的多重继承需求在Smalltalk中并不常见。 7. **设计考量** 多重继承在设计中应该谨慎使用,因为它...
JPA是ORM(Object-Relational Mapping)规范,它简化了Java应用程序与关系数据库之间的数据访问,通过POJO(Plain Old Java Object)就能操作数据库。JNDI提供了一种标准的方式来查找和绑定网络资源,如数据库连接池...
通过学习和实践这个例子,开发者不仅可以掌握如何在VB6中使用WebBrowser控件,还能了解到如何将Web功能集成到传统桌面应用中,这对于开发混合型应用非常有帮助。 总之,"Visual Basic6.0时尚百例源使用r控件浏览...
同时,ORM(Object-Relational Mapping)框架如Hibernate和MyBatis也可能被提及,它们简化了Java对象与数据库表之间的映射,降低了数据库操作的复杂性。 除此之外,书中还会涉及Java Web的安全性问题,比如身份验证...
它提供了set、get、remove方法来操作线程局部变量,以及protected Object initialValue()方法用于提供初始值。 JDK中的Future是一个异步计算结果的接口,它提供了检查计算是否完成的方法,以及获取计算结果的方法。...
7. **JPA(Java Persistence API)**:JPA是Java提供的ORM(Object-Relational Mapping)规范,简化了Java应用程序与数据库之间的交互,通过注解或XML配置实现对象与关系表的映射。 8. **Web服务**:J2EE支持创建和...