对于guice,经过前文的叙述,应该有了相对清晰的了解guice,那么我们归根到底技术还是要结合业务的,因此,与时下流行的springboot进行协作处理,加深理解。开始,spring与guice的出发点是一样的,但是后来spring逐渐形成一个技术栈,但他们并不冲突。不慌。

回顾一下springboot rest Controller

springboot这套东西呢,用来监听网络端口,起一个servlet,将自己注册进去等等网络相关的事情,然后把网络上的responses 放到我们java具体的类中,map下来之后,我们通过一系列框架或自己的方法来搭建业务逻辑,本文利用guice来搭建业务逻辑,将这些业务逻辑当作一个模块,inject到springboot框架去中,当然只是业务逻辑的入口,暴露给控制层。

当然,我们利用spring的Jpa来处理Dao数据,并包装成guice的一个依赖注入到我们业务逻辑的框架中。整体如下:

springboot官网复制一套快速helloworld,guice部分pom复制    学习(一) 的内容.

在本章中,我想要的是将简单的helloworld来阐述guice与spring的整合,以及有关作用域的问题。用到了之前章节helloworld的部分代码;

先铺垫代码,后解释:

@RestController
@SpringBootApplication
public class SimpleController {@Bean Injector injector(){return Guice.createInjector(new HelloWorldWebModule());}@BeanRequestParams requestParam(Injector injector){return injector.getInstance(RequestParams.class);}@BeanWebDestination desdestination(Injector injector){return injector.getInstance(WebDestination.class);}@BeanMyApplet applet(Injector injector){return injector.getInstance(MyApplet.class);}@Autowired MyApplet applet;//调用helloworld@Autowired WebDestination destination;//组合字符串@Autowired RequestParams requestParam;//仅仅将name设置进到局部变量@GetMapping("/hello")String home(@RequestParam String name) {requestParam.setMessage(name);applet.run();return destination.getResult();}public static void main(String[] args) throws Exception {SpringApplication.run(SimpleController.class, args);}
}

控制层,对象使用Autowire进行自动装配,@SpringBootApplication内含有@Configuration,故可以自己定义@Bean让spring进行注入,然后注入我们建立的类,同时参数引用guice的Injector,并建立。

public class HelloWorldWebModule extends AbstractModule {@Overridepublic void configure() {bind(MyApplet.class).to(StringWtringApplet.class);bind(MyDestination.class).to(WebDestination.class);}@Provides @OutPut String getOutputString(RequestParams requestParams){return requestParams.getMessage();}
}
public class RequestParams {private String message;public RequestParams() {System.out.println("RequestParams constroct");}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}}
public class WebDestination implements MyDestination {private final StringBuilder sb = new StringBuilder();public WebDestination() {System.out.println("WebDestination constroct");}@Overridepublic void write(String string) {sb.append(string);}public String getResult() {return sb.toString();}}

上述加构造函数方便我们观看其生命周期和对象。执行后,我们会发现

WebDestination constroct 会打印,两次,RequestParams constroct一次

虽然Spring创建的都是SingleTon,但是在建立MyApplet时,会建立一个MyDestination,然后spring也建立了一个MyDestination,因此会出2次,而RequestParams constroct,是因为

public class StringWtringApplet implements MyApplet {private MyDestination destination;private Provider<String> stringProvider;@Injectpublic StringWtringApplet(MyDestination destination, @OutPut Provider<String> stringProvider) {super();this.destination = destination;this.stringProvider = stringProvider;}private void writerString() {destination.write(stringProvider.get());//get(),只有get的时候才会建立,因此每次访问的时候就会建立一次。}....

然后因为

 @Provides @OutPut String getOutputString(RequestParams requestParams){return requestParams.getMessage();}

看到他需要requestParams一次就建立一次,因此我们永远拿不到输出,因为不是同一个对象。

我们可以在RequestParams.class 和WebDestination.class上加上@Singleton,当然是给guice看的,这样就可以保证destination不建立2次。这样我们就能准确输出了

虽然已经实现了操作,但是还没有分包,以及还可以优化,具体优化重构在代码内:
代码地址

总结:

整个小项目:

通过Springboot进行总控,然后各自做各自事情,guice做依赖注入,springboot做技术栈的事情

互相怎么获得对方的Instance?各自绑定Guice的Injector 和    Application Context.

还有就是注意对象的生命周期,这个是生产环境最容易出问题的地方。

两者区别

一、guice并不是Spring的重制版
二、绑定

spring:

--    配置文件体现完整装配结构。       细致地来进行描述每个地方的组装

--    总的来说使用字符串   实例名:属性名           描述的时候

--    在Config Time 完成对象组装            run的时候,在读取的时候就搭建出来整个结构,整个过程叫Config Time

guice:

--     java代码来描述绑定的规则

--     每个依赖/注入只描述局部的依赖

--     没有Config Time    仅记录下来并验证规则,需要的时候才去加载

三、优点
guice
--       代码量少
--       性能优异
--        泛型支持     --spring虽然3.0后加入了,但是内部数据结构还是没有泛型结构
--        通过Constructor 绑定  Immutable    Object(不可变),不需要getter/setter
好处,可以在内存中仅放一份,不需要拷来拷去,且线程安全。
--         强类型     容易判断错误
--        易于重构    都是绑定java的类,易于Refactor
四、缺点
guice 
--    Module绑定的规则不容易理解,要求我们guice的开发者做一个容易理解的包装
--     文档教程、社区资源少
--    无法搭出特殊结构:循环依赖。。。。。
五、不建议从Spring迁移到guice

--        好处小于代价,虽然他们其实并不冲突

新项目上可以尝试,但与其他组件整合的时候务必注意生命周期,如果现有的Scope不满足,可以自己来实现,当然官网有实例,如果有什么不理解的可以提出,共同讨论

google(轻量级依赖注入框架)Guice学习 (四) guice与springboot简单协作、总结相关推荐

  1. Google开源依赖注入框架-Guice指南

    持续坚持原创输出,点击蓝字关注我吧 作者:软件质量保障 知乎:https://www.zhihu.com/people/iloverain1024 之前发过一篇文章<浅谈依赖注入的实现>, ...

  2. 依赖注入框架Autofac学习笔记

    Autofac是一个轻量级的依赖注入框架,可以在这里面下载:http://code.google.com/p/autofac/downloads/list 要想了解什么是依赖注入,可以参考下这篇博客: ...

  3. Google Guice 一个轻量级的依赖注入框架

    1.美图 2.概述 2.1 背景 在做项目的时候,看见有段代码直接是使用Google Guice 注入了avaitor表达式. 2.1 官网 Github 主页:https://github.com/ ...

  4. Kotlin依赖注入框架Koin的使用

    一.引入Koin依赖 Koin是一款轻量级的依赖注入框架,根据官方的描述,它无代理,无代码生成,无反射. def koinVersion = "2.2.2"//Koin for a ...

  5. android组件浮动在activity上_Jetpack Hilt 依赖注入框架上手指南

    code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群 作者:LvKang-insist 链接:https://juejin.im/post/5efdff9d6fb9a07e ...

  6. 依赖注入框架(DI Framework)

    在采用依赖注入实现的 Notification 类中,虽然我们不需要用类似 hard code 的方式,在类内部通过 new 来创建 MessageSender 对象,但是,这个创建对象.组装(或注入 ...

  7. 依赖注入框架Dagger2详解(一),依赖注入和控制反转的深入理解

    IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良的程序,而Dagger2框架是依赖注入思想践行者的优秀代表. 依赖注入框架Dagger2详解(一), ...

  8. 轻量级HTTP客户端框架—Forest学习笔记

    轻量级HTTP客户端框架-Forest学习笔记 一.Forest 1.1 业务需求 一般情况下是后端提供接口,前端调用,解决需求,但是有的时候为了方便,复用别人的接口(网上的,公共的第三方接口(短信. ...

  9. Android神匕首—Dagger2依赖注入框架详解

    简介 Dagger-匕首,鼎鼎大名的Square公司旗下又一把利刃(没错!还有一把黄油刀,唤作ButterKnife) Dagger2 是一个Android依赖注入框架,由谷歌开发,最早的版本Dagg ...

  10. Koin--适用于Kotlin的超好用依赖注入框架,Dagger替代者,Koin史上最详细解说,一篇就够了,妈妈再也不用担心我不会依赖注入了

    今年呆在家中实在无聊,外面太危险了,还是在家学习比较安全可持续. 过年期间,我又复习了几遍依赖注入框架Dagger. 诶,什么是依赖注入? 说白了就是降低跟类对象之间的耦合,当需要修改类对象的时候,能 ...

最新文章

  1. 03-MySQL多表操作
  2. tomcat 多人登录cpu占用过多_服务器被植入木马,CPU飙升200%
  3. who whoami who am i的区别
  4. STM32F4 HAL库开发 -- DMA
  5. 5.0安装没有costom mysql_Zabbix5.0监控mysql配置
  6. scikit-learn决策树算法类库使用小结
  7. 华中科技大学计算机视觉张朋,管涛-华中科技大智能媒体计算与网络安全实验室...
  8. li标签横向排列_lt;bdigt; | HTML5 双向隔离标签
  9. 279. 完全平方数(JavaScript)
  10. Python数据库编程之pymysql详解
  11. 基于java的教师教学评价管理系统
  12. 获取指定文件夹下所有的同种类型文档的名字(Python)
  13. Win11安卓子系统无法启动怎么办?安卓子系统启用虚拟机平台教程(确保在可选的Windows功能中启用虚拟机平台)
  14. git 同时连接云效平台和github
  15. IFS认证辅导,国际食品企业认证BRC和IFS起源和发展
  16. Apache Solr任意文件读取漏洞复现
  17. shell-判断两个ip是否在同一个网段
  18. Cadence手工创建PCB元件
  19. bank conflict
  20. Java SE基础(更新中)

热门文章

  1. matlab latex表示,科学网—MATLAB程序如何在latex上发表? - 卢远志的博文
  2. Firebug插件:
  3. Odin WindowEditor使用体会
  4. LAMMPS分子动力学模拟技术与应用 第一性原理计算方法及应用
  5. 模块已加载,但找不到入口点DLLRegisterServer
  6. 全球IP地址分配对应表
  7. opencv 摄像机标定
  8. Cisco交换机下载IOS
  9. Jon的Java程序员实习报告
  10. 鸡兔同笼php编程,C语言鸡兔同笼问题