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++依赖注入示例相关推荐

  1. spring注入私有字段_Spring字段依赖注入示例

    spring注入私有字段 了解如何编写Spring Field Injection示例 . 字段注入是Spring框架 依赖注入的一种 . 在本教程中,我们将编写几个类,并看一看现场注入工程. 有关S ...

  2. Spring Setter依赖注入示例

    学习如何编写Spring Setter依赖注入示例 . Setter注入是Spring依赖注入的一种 . Spring支持字段注入,Setter注入以及构造函数注入,以将依赖项注入Spring托管的b ...

  3. Spring字段依赖注入示例

    学习如何编写Spring Field Injection示例 . 字段注入是Spring框架 依赖注入的一种 . 在本教程中,我们将编写几个类,并看一看现场注入工程. 有关Spring依赖注入的更多信 ...

  4. guice依赖注入原理_Google Guice依赖注入示例教程

    guice依赖注入原理 Google Guice is the framework to automate the dependency injection in applications. If y ...

  5. php 框架 容器,thinkphp5.1框架容器与依赖注入实例分析

    本文实例讲述了thinkphp5.1框架容器与依赖注入.分享给大家供大家参考,具体如下: 容器----/thinkphp/library/think/Container.php 依赖注入:将对象类型的 ...

  6. php 依赖注入框架,通过实现依赖注入和路由,构建一个自己的现代化PHP框架

    如何提高自己编写代码的能力呢?我们首先想到的是阅读学习优秀的开源项目,然后写一个自己的web框架或类库组件.作为web开发者,我们通常都是基于面向对象OOP来开发的,所以面向对象的设计能力或者说设计模 ...

  7. 【 .NET Core 3.0 】框架之九 || 依赖注入 与 IoC

    本文有配套视频:https://www.bilibili.com/video/av58096866/?p=5 前言 1.重要:如果你实现了解耦,也就是 api 层只引用了 IService 和 IRe ...

  8. php 注入是什么意思,如何理解ThinkPHP框架里的依赖注入?

    依赖注入,你可以分开理解.拆成,依赖和注入 依赖:就是你现在要用 request 对象的get 方法,所有你必须要先能得到request对象,然后才能使用这个方法.这个就是依赖. 注入:怎么得到req ...

  9. java dna框架_DNA - IOC依赖注入 - 组件类库 - JAVA开源项目 - 开源吧

    相关开源项目 Coinjema:Coinjema这个组件通过AspectJ与Groovy提供了一种强大的依赖注入机制.假如你厌烦一大堆XML配置文件,和需要掌握复杂工厂类与容器的时候,这个non-AP ...

  10. 从壹开始前后端分离【 .NET Core2.2 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探...

    更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjoy8/BlogArti ...

最新文章

  1. Android String.xml 批量翻译工具 | Android string.xml 各国语言转换
  2. 19倍超音速“大炮”轰出可控核聚变!成本仅为传统方法0.1%,腾讯已投资
  3. php多个 r n如何过滤,php怎么去掉r n
  4. vba宏语言_三分钟了解Excel的程序语言VBA
  5. 读《一个程序猿的生命周期》有感
  6. mysql general clomun_几个简单的sql查询
  7. mysql sql语法分析验证优化工具
  8. SIMD and Avx2
  9. php是世界上最好的语言吗
  10. [历朝通俗演义-蔡东藩-前汉]第011回 降真龙光韬泗水 斩大蛇夜走丰乡
  11. Windows XP怎样实现自动登录而无需输入密码
  12. [附源码]java毕业设计基于的高校学生考勤管理系统
  13. 自动合并table中相同的单元格以及java自动合并excel相同单元格
  14. 亚马逊抄作业,股票打折安排上
  15. halcon算法库中各坐标系,位姿的解释及原理
  16. 前端攻城狮的自我修养1
  17. 【Python】将xmind写的测试用例转成禅道可导入的excel格式
  18. Unity 网页插件Embedded Browser的使用
  19. consul重启导致服务必须跟着重启解决方案
  20. 刘强东的代码水平到底有多牛? 网友:95年一个晚上赚5万!

热门文章

  1. 艾宾浩斯遗忘曲线函数
  2. 易语言 服务器抓包,易语言调用wincap实现网卡抓包
  3. 2005/4.29/狂阵雨
  4. 高考数学之快速解选择题
  5. java.util.zip.ZipException: invalid code lengths set解决办法
  6. 页面劫持修复方法,织梦dedeCMS被流氓网站劫持如何解决
  7. 一个推理问题:求老师生日
  8. MATLAB画图符号标注
  9. IE不兼容HTML5、CSS3解决方法
  10. 50个查询系列-第13个查询:把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩;...