[翻译]Drools6.2帮助文档-10.CDI

10. CDI
更多相关网页:
http://www.jdon.com/38322
http://www.jdon.com/37976
http://www.cdi-spec.org/
10.1.介绍
CDI,全称Contexts and Dependency Injection(上下文和依赖注入),是向应用程序提供声明控制和结构的Java规范。KIE可以用它来实现自动实例化和绑定,而不需要使用编程的API。
10.2.注解
@KContainer, @KBase, @KSession都支持可选的'name'属性。CDI在它注入的时候一般不会"getOrCreate",同一组注解下,所有注入都会得到相同的实例。'name'标签会强制给每个名称一个唯一实例,尽管这个名称的所有的实例会在使用equals方法得到的结果是true。
10.2.1. @KReleaseId
绑定一个实例指向一个特定版本的KieModule。如果kie-ci在classpath中,依赖关系会被自动解决,并从远程仓库中下载。
10.2.2. @KContainer
@KContainer是可选的,因为在使用@Inject和变量类型推断时会被检测到,并添加进来。
图10.1.注入KieContainer
@Inject
private KieContainer kContainer;

图10.2.为动态的KieModule注入KieContainer
@Inject
@KReleaseId(groupId = "jar1", artifactId = "art1", version = "1.1")
private KieContainer kContainer;

图10.3.为动态的KieModule注入带名称的KieContainer
@Inject
@KContainer(name = "kc1")
@KReleaseId(groupId = "jar1", artifactId = "art1", version = "1.1")
private KieContainer kContainer;



10.2.3. @KBase
@KBase是可选的,因为在使用@Inject和变量类型推断时会被检测到,并添加进来。
如果给的话,默认参数是在kmodule.xml中定义的KieBase的值属性和名称。
图10.4. 注入默认的KieBase,从Classpath KieContainer获得
@Inject
private KieBase kbase;


图10.5. 注入默认的KieBase,从动态KieModule获得
@Inject
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0")
private KieBase kbase;


图10.6. 'jar1.KBase1' KieBase版本加载时一起处理(不懂)
@Inject
@KBase("kbase1")
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0")
private KieBase kbase1v10;
@Inject
@KBase("kbase1")
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.1")
private KieBase kbase1v10;


图10.7. 使用'name'属性强制为'jar1.KBase1' KieBase创建新实例
@Inject
@KSession(value="kbase1", name="kb1")
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0")
private KieBase kbase1kb1;
@Inject
@KSession(value="kbase1", name="kb2")
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0")
private KieBase kbase1kb2;

10.2.4. @KSession for KieSession
@KSession是可选的,因为在使用@Inject和变量类型推断时会被检测到,并添加进来。
如果指定的话,默认参数是在kmodule.xml中定义的KieSession的值属性和名称。
Figure 10.8. 注入默认的KieSession,从Classpath KieContainer获得
@Inject
private KieSession ksession;

图10.9. 注入默认的KieSession,从动态KieModule获得
@Inject
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0")
private KieSession ksession;


图10.10. 'jar1.KBase1' KieBase版本加载时一起处理(同样不懂)
@Inject
@KSession("ksession1")
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0")
private KieSession ksessionv10;
@Inject
@KSession("ksession1")
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.1")
private KieSession ksessionv11;


图10.11. 使用'name'标签强制为'jar1.KBase1' KieSession创建新实例
@Inject
@KSession(value="ksession1", name="ks1")
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0")
private KieSession ksession1ks1
@Inject
@KSession(value="ksession1", name="ks2")
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0")
private KieSession ksession1ks2


10.2.5. @KSession for StatelessKieSession
@KSession是可选的,因为在使用@Inject和变量类型推断时会被检测到,并添加进来。
如果指定的话,默认参数是在kmodule.xml中定义的KieSession的值属性和名称。
图10.12. 注入默认的StatelessKieSession,从Classpath KieContainer获得
@Inject
private StatelessKieSession ksession;


图10.13. 注入默认的StatelessKieSession,从动态KieModule获得
@Inject
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0")
private StatelessKieSession ksession;

图10.14. 'jar1.KBase1' KieBase版本加载时一起处理(同样不懂)
@Inject
@KSession("ksession1")
@KReleaseId( groupId = "jar1", rtifactId = "art1", version = "1.0")
private StatelessKieSession ksessionv10;
@Inject
@KSession("ksession1")
@KReleaseId( groupId = "jar1", rtifactId = "art1", version = "1.1")
private StatelessKieSession ksessionv11;


图10.15.使用'name'标签强制为'jar1.KBase1' StatelessKieSession创建新实例
@Inject
@KSession(value="ksession1", name="ks1")
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0")
private StatelessKieSession ksession1ks1
@Inject
@KSession(value="ksession1", name="ks2")
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0")
private StatelessKieSession ksession1ks2


10.3. API示例对比
CDI可以注入实例到字段,甚至以参数形式传递它们。下面是使用字段注入的例子。
图10.16. CDI示例,命名的KieSession
@Inject
@KSession("ksession1")
KieSession kSession;
public void go(PrintStream out) {
kSession.setGlobal("out", out);
kSession.insert(new Message("Dave", "Hello, HAL. Do you read me, HAL?"));
kSession.fireAllRules();
}

这种方式下代码更少,且比API方法更具声明性。

图10.17. 使用API实现相同功能的代码
public void go(PrintStream out) {
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("ksession1");
kSession.setGlobal("out", out);
kSession.insert(new Message("Dave", "Hello, HAL. Do you read me, HAL?"));
kSession.fireAllRules();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值