烽火台使用说明

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

烽火台开发使用说明1.IOC使用说明烽火台使用googleguice1.0作为底层的IOC框架,对guice的功能进行了简单的封装,应用程序在使用IOC功能时,应禁止使用guice提供的接口(.classpath禁止包含guice.jar),避免应用程序对guice产生依赖关系。1.1.第一个例子1、接口Service1.publicinterfaceService{2.voidhello();3.}2、接口Service的实现类1.publicclassServiceImplimplementsService{2.publicvoidhello(){3.System.out.println(hello);4.}5.}3、建立依赖关系有了接口和实现类,烽火台采用[Implement]标记绑定ServiceImpl和Service之间的依赖关系,如下所示:1.importcn.gwssi.common.tag.ioc.Implement;2.3.@Implement(clazz=Service.class)4.publicclassServiceImplimplementsService{5.publicvoidhello(){6.System.out.println(hello);7.}8.}4、依赖注入烽火台采用[Inject]标记创建Service的实例,如下所示:1.importcn.gwssi.common.tag.ioc.Inject;2.3.publicclassMain{4.@InjectprivateServiceservice;5.6.publicstaticvoidmain(String[]args)7.{8.(newMain()).service.hello();9.}10.}5、Implement标签的功能是,告诉烽火台框架,ServiceImpl类是Service接口的标准实现类,任何使用Inject标签标注的Service变量(可以是static、public、protected、private),都会被自动初始化成ServiceImpl的实例。6、烽火台也可以通过Injector类,获得Service的实例,如下所示:1.importcn.gwssi.common.component.ioc.Injector;2.3.publicclassMain{4.publicstaticvoidmain(String[]args)5.{6.Serviceservice=Injector.getInstance(Service.class);7.service.hello();8.}9.}7、烽火台也可以使用ImplementBy标签,通过接口绑定实现类,如下:1.importcn.gwssi.common.tag.ioc.ImplementBy;2.3.@ImplementBy(clazz=ServiceImpl.class)4.publicinterfaceService{5.voidhello();6.}7.8.publicclassServiceImplimplementsService{9.publicvoidhello(){10.System.out.println(hello);11.}12.}8、说明以上演示了烽火台提供的IOC功能的主要接口Implement的功能是,绑定具体类和接口之间的关系,烽火台在遇到接口时能够自动创建类,这种方式不会增加代码中依赖关系,因为实现类总是知道接口的位置;ImplementBy的功能是指定接口的实现类,功能和Implement相同,但是需要在接口类中知道有哪些实现类。这种方式可以让代码容易维护(直接打开接口文件,就能知道有哪些实现类,Implement方式需要查找接口的引用类才能知道接口有哪些实现类),但是这种方式需要在接口中依赖所有的实现类。一般不建议使用,因为它并没有松偶合接口和类之间的关系,除非接口类和实现类在同一个包路径下时,可以考虑这种方式;Inject标签的功能是告诉烽火台,在运行时,自动根据属性的类型(比如上列中service的类型是Service),自动创建由Implement或ImplementBy绑定的实现类;相当于直接调用:privateServiceservice=Injector.getInstance(Service.class);Injector不是标签,是一个工厂类,可以通过Injector.getInstance方法,获得接口的实现类,因为局部变量不能使用Inject修饰,因此只能通过这种方式初始化接口。1.2.依赖注入烽火台提供了两种方式支持四种注入类型,Inject标签可以支持field注入、构造函数注入、和setter注入;Injector工厂类可以支持局部变量的注入。1、field注入1.importcn.gwssi.common.tag.ioc.Inject;2.3.publicclassMain{4.@InjectprivateServiceservice;5.6.publicstaticvoidmain(String[]args)7.{8.(newMain()).service.hello();9.}10.}@Inject标签可以修饰static变量、private、protected、public变量;但是不能修饰final变量。Inject的实现流程是,在调用Main类的构造函数,或针对static变量在调用static{…}函数时,自动增加service=Injectot.getInstance(Service.class)。因为以上这行代码总是在您编写的所有代码前被调用,因此您在代码中尽量不要直接修改变量的值,也不要在构造函数中初始化service变量。上面的例子相当于1.importcn.gwssi.common.tag.ioc.Inject;2.3.publicclassMain{4.privateServiceservice;5.6.publicvoidMain()7.{8.super();9.service=Injectot.getInstance(Service.class);10.……(构造函数的其它代码)11.}12.13.publicstaticvoidmain(String[]args)14.{15.service.hello();16.}17.}2、构造函数注入1.importcn.gwssi.common.tag.ioc.Inject;2.importcn.gwssi.common.component.ioc.Injector;3.4.publicclassMain{5.privateServiceservice;6.7.publicMain(@InjectServiceservice)8.{9.this.service=service;10.}11.12.publicstaticvoidmain(String[]args)13.{14.Mainm=Injector.getInstance(Main.class);15.m.service.hello();16.}17.}@Inject标签可以修饰构造函数的输入参数,当构造函数的所有输入参数都使用Inject修饰的时候,就可以通过Injector.getInstance获得这个类的实例。上列相当于在运行时,烽火台为Main类增加了一个构造函数1.publicMain()1.{2.this(Injector.getInstance(Service.class));3.}因此,如果您不愿意使用Injector方式获得Main的实例,上列可以修改成以下方式1.importcn.gwssi.common.tag.ioc.Inject;2.3.publicclassMain{4.privateServiceservice;5.6.//会被替换7.publicMain()8.{9.10.}11.12.publicMain(@InjectServiceservice)13.{14.this.service=service;15.}16.17.publicstaticvoidmain(String[]args)18.{19.Mainm=newMain();20.m.service.hello();21.}22.}第一个构造函数会被烽火台自动生成的构造函数替换。进一步说明:并不需要修饰构造函数的所有输入参数,这样在创建类的时候可以手工传入部分参数,比如:23.publicMain(intid,@InjectServiceservice,Stringdesc)24.{25.this.service=service;26.}这种使用方式需要工厂类的介入,在后面介绍。3、setter注入1.importcn.gwssi.common.tag.ioc.Inject;2.3.publicclassMain{4.privateServiceservice;5.6.@Inject7.publicvoidsetService(Serviceservice)8.{9.this.service=service;10.}11.12.publicstaticvoidmain(String[]args)13.{14.Mainm=newMain();15.m.service.hello();16.}17.}这种方式和field注入方式的工作原理类似,但是setter方法在构造函数执行完以后运行,因此在构造函数中不能访问service变量,烽火台修改了Main类的构造函数:1.publicMain()2.{3.…4.…5.setService(Injector.getInstance(Service.class));6.}目前@Inject标签的修饰Method的规则是:没有返回参数,只有一个输入参数,并且是对象(不能是int、long等类型)。4、Injector创建类1.importcn.gwssi.common.component.ioc.Injector;2.3.publicclassMain{4.publicstaticvoidmain(String[]args)5.{6.Serviceservice=Injector.getInstance(Service.class);7.service.hello();8.}9.}局部变量不能用@Inject修饰。1.3.单实例对象缺省情况下,每次调用都会创建一个新的实例,烽火台支持单实例方式:1.importcn.gwssi.common.tag.ioc.ImplementBy;2.3.publicinterfaceService{4.voidhello();5.}6.7.@Implement(clazz=Service.class,scope=Implement.SCOPE.SINGLETON)8.publicclassServiceImplimplementsService{9.publicvoidhello(){10.System.out.println(hello);11.}12.}或者1.importcn.gwssi.common.tag.ioc.ImplementBy;2.3.@ImplementBy(clazz=ServiceImpl.class,scope=ImplementBy.SCOPE.SINGLETON)4.publicinterfaceService{5.voidhello();6.}7.8.publicclassServiceImplimplementsService{9.publicvoidhello(){10.System.out.println(hello);11.}12.}@Implement和@ImplementBy标签都支持scope=SCOPE.SINGLETON属性,

1 / 235
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功