使用Autumn框架进行C++依赖注入示例
1.1. Autumn简介
Autumn Framework是一个C++的依赖注入(DI)框架,它的功能是模仿JAVA领域中的Spring框架来的。当前只是提供依赖注入功能,而且尽量做到对原代码的不侵入。因为C++没有象JAVA那样的动态反射机制,不能很容易地在运行时得到注入的一些相关信息,所以在使用Autumn的时候,需要做一些工作来让Autumn框架知道注入时所需要的一些信息,即使用Autumn自带的一个工具AutumnGen来生成一些Wrapper文件。
通过使用Autumn,可以将动态库很容易地跟原来的程序部署在一起,而不需要重新编译原有程序。
Autumn可以从这儿下载并编译,当前最新版本是0.5.0。
1.2. Autumn示例
例子很简单。文件Action.h中定义了一个接口Action,如下:
class Action {
public:
virtual string excute(const char* s) = 0;
};
对该接口做一些不同的实现,然后在我们的程序中调用。
1.2.1. 不使用Autumn的开发过程
我们在文件LowerAction.h中对接口做一个实现LowerAction(因为比较简单,所以没有写.cpp文件),如下:
class LowerAction: public Action{
private:
string Message;
public:
LowerAction(const char* msg){
this->Message = msg;
}
string excute(const char* s){
string r = this->Message + ", " + s;
for( int i = 0; i < r.length(); i++)
r[i] = tolower(r[i]);
return r;
}
};
在文件UpperAction.h中对接口做另一个新的实现UpperAction,如下:
class UpperAction: public Action{
private:
string Message;
public:
void setMessage(const char* msg){
this->Message = msg;
}
string excute(const char* s){
string r = this->Message + ", " + s;
for( int i = 0; i < r.length(); i++)
r[i] = toupper(r[i]);
return r;
}
};
现在写主程序。
开始我们想调用LowerAction这个实现:
#include <iostream>
#include "Action.h"
#include "LowerAction.h"
int main(int argc, char* argv[])
{
Action* pa = new LowerAction(“Hello”);
cout<<pa->excute("Vincent")<<endl;
delete pa ;
return 0;
}
在主程序中,为LowerAction传入构造参数。编译主程序后,可得到运行结果:
hello, vincent
后来,我们想调用UpperAction这个实现,我们需要修改主程序,如下:
#include <iostream>
#include "Action.h"
#include "UpperAction.h"
int main(int argc, char* argv[])
{
UpperAction* pua = new UpperAction();
pua->setMessage("Hello");
Action* pa = pua;
cout<<pa->excute("Vincent")<<endl;
delete pa;
return 0;
}
在主程序中需要为UpperAction的实例设置属性Message。编译主程序后,可得到运行结果:
HELLO, VINCENT
当想换用不同的实现时,我们需要做以下几项工作:
w 修改主程序(原来是要new一个LowerAction,后来要new一个UpperAction);
w 为不同的实现进行实例化相关的一些操作,比如设置属性;
w 重新编译程序。
1.2.2. 使用Autumn的开发过程
Autumn框架尽量做到对原来代码不侵入,所以,使用Autumn框架时,接口文件Action.h及实现文件LowerAction.h和UpperAction.h都不需要修改。使用Autumn开发,大概有如下五个步骤。
1.2.2.1. 生成Wrapper文件
为那些需要Autumn来操作的类(主要是那些用来注入或被注入的类)生成Wrapper。使用AutumnGen可以根据C++的头文件自动生成相关的Wrapper文件。在本示例中为LowerAction和UpperAction生成Wrapper,命令如下:
AutumnGen LowerAction.h UpperAction.h
执行后生成四个文件:LowerAction_Wrapper.h、LowerAction_Wrapper.cpp、UpperAction_Wrapper.h、UpperAction_Wrapper.cpp。
1.2.2.2. 生成动态库
Autumn主要是基于动态库来实现灵活的依赖注入的。我们要把需要Autumn来操作的类及其Wrapper编译到一个动态库中。在本示例中,我们将实现LowerAction、UpperAction及其Wrapper都编译到一个动态库ActionImpl.dll中。
1.2.2.3. 编写配置文件
实现类都存在于ActionImpl.dll中,我们想让其提供LowerAction的实现,可以编写如下一个配置文件autumnDemo.xml:
<?xml version="1.0" encoding="UTF-8"?>
<autumn>
<library path="../lib/ActionImpl.dll" name="ActionImpl">
<beans>
<bean class="LowerAction" name="TheAction">
<constructor-arg>
<argument>
<value>Hello</value>
</argument>
</constructor-arg>
</bean>
</beans>
</library>
</autumn>
Autumn的配置文件采用XML格式,相应的schema文件autumn.xsd在源码包中。本配置文件中指出了动态库的路径(../lib/ActionImpl.dll),实现类的类名(LowerAction),实现类在Autumn中的命名(TheAction),实现类的构造参数(”Hello”)等内容。
1.2.2.4. 编写主程序
主程序中使用Autumn的BeanFactory来取得想使用的实现类,调用其excute方法。程序如下:
#include <iostream>
#include <exception>
#include "Action.h"
#include "IBeanFactory.h"
using namespace std;
int main(int argc, char* argv[])
{
try{
Autumn::IBeanFactory* bf;
bf = Autumn::getBeanFactoryWithXML("autumnDemo.xml");
Action* pa = (Action*)bf->getBean("TheAction");
cout<<pa->excute("Vincent")<<endl;
bf->freeBean(pa);
Autumn::deleteBeanFactory(bf);
}catch (const exception& e ) {
cout<<"Exception: "<<e.what()<<endl;
}
return 0;
}
主程序中首先取得BeanFactory,然后调用其getBean方法来取得实现类,用完之后,通过其freeBean来释放该实现类,程序最后释放BeanFactory。Autumn框架中的接口都在名字空间Autumn中。程序编译时需要连接Autumn框架的库文件AutumnFramework.lib(在非Windows平台上是libAutumn.so)。
按照上面1.2.2.3. 中的配置文件,使用的实现类是LowerAction,运行主程序,结果如下:
hello, vincent
1.2.2.5. 换用不同的实现
如果想不用LowerAction,而去使用UpperAction这个实现,可以修改配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<autumn>
<library path="../lib/ActionImpl.dll" name="ActionImpl">
<beans>
<bean class="UpperAction" name="TheAction">
<properties>
<property name="Message" type="char*">
<value>Hello</value>
</property>
</properties>
</bean>
</beans>
</library>
</autumn>
保存配置文件后,不需要重新编译任何程序,直接运行主程序,结果如下:
HELLO, VINCENT
如果想更改实现类的属性值,也不需要修改程序,只需要修改Autumn的配置文件即可。修改LowerAction的属性值,只要修改配置文件中的构造参数即可,如把Hello改为Hi;同样如果想修改UpperAction的属性值,只要修改配置文件中它的名字为Message的属性的值即可。
从这儿下载示例源代码。
使用Autumn框架进行C++依赖注入示例相关推荐
- spring注入私有字段_Spring字段依赖注入示例
spring注入私有字段 了解如何编写Spring Field Injection示例 . 字段注入是Spring框架 依赖注入的一种 . 在本教程中,我们将编写几个类,并看一看现场注入工程. 有关S ...
- Spring Setter依赖注入示例
学习如何编写Spring Setter依赖注入示例 . Setter注入是Spring依赖注入的一种 . Spring支持字段注入,Setter注入以及构造函数注入,以将依赖项注入Spring托管的b ...
- Spring字段依赖注入示例
学习如何编写Spring Field Injection示例 . 字段注入是Spring框架 依赖注入的一种 . 在本教程中,我们将编写几个类,并看一看现场注入工程. 有关Spring依赖注入的更多信 ...
- guice依赖注入原理_Google Guice依赖注入示例教程
guice依赖注入原理 Google Guice is the framework to automate the dependency injection in applications. If y ...
- php 框架 容器,thinkphp5.1框架容器与依赖注入实例分析
本文实例讲述了thinkphp5.1框架容器与依赖注入.分享给大家供大家参考,具体如下: 容器----/thinkphp/library/think/Container.php 依赖注入:将对象类型的 ...
- php 依赖注入框架,通过实现依赖注入和路由,构建一个自己的现代化PHP框架
如何提高自己编写代码的能力呢?我们首先想到的是阅读学习优秀的开源项目,然后写一个自己的web框架或类库组件.作为web开发者,我们通常都是基于面向对象OOP来开发的,所以面向对象的设计能力或者说设计模 ...
- 【 .NET Core 3.0 】框架之九 || 依赖注入 与 IoC
本文有配套视频:https://www.bilibili.com/video/av58096866/?p=5 前言 1.重要:如果你实现了解耦,也就是 api 层只引用了 IService 和 IRe ...
- php 注入是什么意思,如何理解ThinkPHP框架里的依赖注入?
依赖注入,你可以分开理解.拆成,依赖和注入 依赖:就是你现在要用 request 对象的get 方法,所有你必须要先能得到request对象,然后才能使用这个方法.这个就是依赖. 注入:怎么得到req ...
- java dna框架_DNA - IOC依赖注入 - 组件类库 - JAVA开源项目 - 开源吧
相关开源项目 Coinjema:Coinjema这个组件通过AspectJ与Groovy提供了一种强大的依赖注入机制.假如你厌烦一大堆XML配置文件,和需要掌握复杂工厂类与容器的时候,这个non-AP ...
- 从壹开始前后端分离【 .NET Core2.2 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探...
更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjoy8/BlogArti ...
最新文章
- Android String.xml 批量翻译工具 | Android string.xml 各国语言转换
- 19倍超音速“大炮”轰出可控核聚变!成本仅为传统方法0.1%,腾讯已投资
- php多个 r n如何过滤,php怎么去掉r n
- vba宏语言_三分钟了解Excel的程序语言VBA
- 读《一个程序猿的生命周期》有感
- mysql general clomun_几个简单的sql查询
- mysql sql语法分析验证优化工具
- SIMD and Avx2
- php是世界上最好的语言吗
- [历朝通俗演义-蔡东藩-前汉]第011回 降真龙光韬泗水 斩大蛇夜走丰乡
- Windows XP怎样实现自动登录而无需输入密码
- [附源码]java毕业设计基于的高校学生考勤管理系统
- 自动合并table中相同的单元格以及java自动合并excel相同单元格
- 亚马逊抄作业,股票打折安排上
- halcon算法库中各坐标系,位姿的解释及原理
- 前端攻城狮的自我修养1
- 【Python】将xmind写的测试用例转成禅道可导入的excel格式
- Unity 网页插件Embedded Browser的使用
- consul重启导致服务必须跟着重启解决方案
- 刘强东的代码水平到底有多牛? 网友:95年一个晚上赚5万!
热门文章
- 艾宾浩斯遗忘曲线函数
- 易语言 服务器抓包,易语言调用wincap实现网卡抓包
- 2005/4.29/狂阵雨
- 高考数学之快速解选择题
- java.util.zip.ZipException: invalid code lengths set解决办法
- 页面劫持修复方法,织梦dedeCMS被流氓网站劫持如何解决
- 一个推理问题:求老师生日
- MATLAB画图符号标注
- IE不兼容HTML5、CSS3解决方法
- 50个查询系列-第13个查询:把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩;...