From d1ed6d36f8b3b5efdbd4a118c47f232dc8d91eea Mon Sep 17 00:00:00 2001 From: wentch <22250530@qq.com> Date: Thu, 28 Jan 2016 17:56:44 +0800 Subject: [PATCH] --- redkale.html | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/redkale.html b/redkale.html index cf240a2db..7d65a8965 100644 --- a/redkale.html +++ b/redkale.html @@ -83,6 +83,88 @@ }
Application.singleton 运行流程与通过bin脚本启动的流程基本一致,区别在于singleton运行时不会启动Server和Application自身的服务监听。RedKale提倡接入层(Servlet)与业务层(Service)分开,Service在代码上不能依赖于Servlet,因此调试Service自身逻辑时不需要启动接入层服务(类似WebSocket依赖Servlet的功能除外)。
+RedKale内置的依赖注入实现很简单,只有三个类: javax.annotation.Resource、org.redkale.util.ResourceType、org.redkale.util.ResourceFactory,采用反射技术,由于依赖注入通常不会在频繁的操作中进行,因此性能要求不会很高。其中前两个是注解,ResourceFactory是主要操作类,主要提供注册和注入两个接口。ResourceFactory的依赖注入不仅提供其他依赖注入框架的常规功能,还能动态的自动更新通过inject注入的资源。
+public class AService {
+
+ @Resource(name = "property.id")
+ private String id;
+
+ @Resource(name = "property.id") //property.开头的资源名允许String自动转换成primitive数值类型
+ private int intid;
+
+ @Resource(name = "bigint")
+ private BigInteger bigint;
+
+ @Resource(name = "seqid")
+ private int seqid;
+
+ @Resource
+ private ResourceTest.BService bservice;
+
+ @Override
+ public String toString() {
+ return "{id:\"" + id + "\", intid: " + intid + ", bigint:" + bigint + "}";
+ }
+
+ /** 以下省略getter setter方法 */
+}
+
+public class BService {
+
+ @Resource(name = "property.id")
+ private String id;
+
+ @Resource
+ private AService aservice;
+
+ private String name = "";
+
+ @java.beans.ConstructorProperties({"name"})
+ public BService(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public String toString() {
+ return "{name:\"" + name + "\", id: " + id + ", aserivce:" + aservice + "}";
+ }
+
+ /** 以下省略getter setter方法 */
+}
+
+
+public static void main(String[] args) throws Exception {
+ ResourceFactory factory = ResourceFactory.root();
+ factory.register("property.id", "2345"); //注入String类型的property.id
+ AService aservice = new AService();
+ BService bservice = new BService("eeeee");
+
+ factory.register(aservice); //放进Resource池内,默认的资源名name为""
+ factory.register(bservice); //放进Resource池内,默认的资源名name为""
+
+ factory.inject(aservice); //给aservice注入id、bservice,bigint没有资源,所以为null
+ factory.inject(bservice); //给bservice注入id、aservice
+ System.out.println(aservice); //输出结果为:{id:"2345", intid: 2345, bigint:null, bservice:{name:eeeee}}
+ System.out.println(bservice); //输出结果为:{name:"eeeee", id: 2345, aserivce:{id:"2345", intid: 2345, bigint:null, bservice:{name:eeeee}}}
+
+ factory.register("seqid", 200); //放进Resource池内, 同时ResourceFactory会自动更新aservice的seqid值
+ System.out.println(factory.find("seqid", int.class)); //输出结果为:200
+ factory.register("bigint", new BigInteger("666666666666666")); //放进Resource池内, 同时ResourceFactory会自动更新aservice对象的bigint值
+ System.out.println(aservice); //输出结果为:{id:"2345", intid: 2345, bigint:666666666666666, bservice:{name:eeeee}} 可以看出seqid与bigint值都已自动更新
+
+ factory.register("property.id", "6789"); //更新Resource池内的id资源值, 同时ResourceFactory会自动更新aservice、bservice的id值
+ System.out.println(aservice); //输出结果为:{id:"6789", intid: 6789, bigint:666666666666666, bservice:{name:eeeee}}
+ System.out.println(bservice); //输出结果为:{name:"eeeee", id: 6789, aserivce:{id:"6789", intid: 6789, bigint:666666666666666, bservice:{name:eeeee}}}
+
+ bservice = new BService("ffff");
+ factory.register(bservice); //更新Resource池内name=""的BService资源, 同时ResourceFactory会自动更新aservice的bservice对象
+ factory.inject(bservice);
+ System.out.println(aservice); //输出结果为:{id:"6789", intid: 6789, bigint:666666666666666, bservice:{name:ffff}}
+
+}如上例,通过ResourceFactory.inject注入的对象都会自动更新资源的变化,若不想自动更新可以使用public Object register(String name, Type clazz, Object rs) 方法注册新资源。
+ 通常一个系统会分为三层:接入层、业务层、数据层。对应到RedKale的组件是: Servlet、Service、Source。大部分系统提供的是HTTP服务,为了方便演示RedKale从集中式到分布式的变化,以一个简单的HTTP服务作为范例。
开发一个极简单的小论坛系统。包含三个模块: