google(轻量级依赖注入框架)Guice学习 (四) guice与springboot简单协作、总结
对于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 仅记录下来并验证规则,需要的时候才去加载
三、优点
四、缺点
五、不建议从Spring迁移到guice
-- 好处小于代价,虽然他们其实并不冲突
新项目上可以尝试,但与其他组件整合的时候务必注意生命周期,如果现有的Scope不满足,可以自己来实现,当然官网有实例,如果有什么不理解的可以提出,共同讨论
google(轻量级依赖注入框架)Guice学习 (四) guice与springboot简单协作、总结相关推荐
- Google开源依赖注入框架-Guice指南
持续坚持原创输出,点击蓝字关注我吧 作者:软件质量保障 知乎:https://www.zhihu.com/people/iloverain1024 之前发过一篇文章<浅谈依赖注入的实现>, ...
- 依赖注入框架Autofac学习笔记
Autofac是一个轻量级的依赖注入框架,可以在这里面下载:http://code.google.com/p/autofac/downloads/list 要想了解什么是依赖注入,可以参考下这篇博客: ...
- Google Guice 一个轻量级的依赖注入框架
1.美图 2.概述 2.1 背景 在做项目的时候,看见有段代码直接是使用Google Guice 注入了avaitor表达式. 2.1 官网 Github 主页:https://github.com/ ...
- Kotlin依赖注入框架Koin的使用
一.引入Koin依赖 Koin是一款轻量级的依赖注入框架,根据官方的描述,它无代理,无代码生成,无反射. def koinVersion = "2.2.2"//Koin for a ...
- android组件浮动在activity上_Jetpack Hilt 依赖注入框架上手指南
code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群 作者:LvKang-insist 链接:https://juejin.im/post/5efdff9d6fb9a07e ...
- 依赖注入框架(DI Framework)
在采用依赖注入实现的 Notification 类中,虽然我们不需要用类似 hard code 的方式,在类内部通过 new 来创建 MessageSender 对象,但是,这个创建对象.组装(或注入 ...
- 依赖注入框架Dagger2详解(一),依赖注入和控制反转的深入理解
IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良的程序,而Dagger2框架是依赖注入思想践行者的优秀代表. 依赖注入框架Dagger2详解(一), ...
- 轻量级HTTP客户端框架—Forest学习笔记
轻量级HTTP客户端框架-Forest学习笔记 一.Forest 1.1 业务需求 一般情况下是后端提供接口,前端调用,解决需求,但是有的时候为了方便,复用别人的接口(网上的,公共的第三方接口(短信. ...
- Android神匕首—Dagger2依赖注入框架详解
简介 Dagger-匕首,鼎鼎大名的Square公司旗下又一把利刃(没错!还有一把黄油刀,唤作ButterKnife) Dagger2 是一个Android依赖注入框架,由谷歌开发,最早的版本Dagg ...
- Koin--适用于Kotlin的超好用依赖注入框架,Dagger替代者,Koin史上最详细解说,一篇就够了,妈妈再也不用担心我不会依赖注入了
今年呆在家中实在无聊,外面太危险了,还是在家学习比较安全可持续. 过年期间,我又复习了几遍依赖注入框架Dagger. 诶,什么是依赖注入? 说白了就是降低跟类对象之间的耦合,当需要修改类对象的时候,能 ...
最新文章
- 03-MySQL多表操作
- tomcat 多人登录cpu占用过多_服务器被植入木马,CPU飙升200%
- who whoami who am i的区别
- STM32F4 HAL库开发 -- DMA
- 5.0安装没有costom mysql_Zabbix5.0监控mysql配置
- scikit-learn决策树算法类库使用小结
- 华中科技大学计算机视觉张朋,管涛-华中科技大智能媒体计算与网络安全实验室...
- li标签横向排列_lt;bdigt; | HTML5 双向隔离标签
- 279. 完全平方数(JavaScript)
- Python数据库编程之pymysql详解
- 基于java的教师教学评价管理系统
- 获取指定文件夹下所有的同种类型文档的名字(Python)
- Win11安卓子系统无法启动怎么办?安卓子系统启用虚拟机平台教程(确保在可选的Windows功能中启用虚拟机平台)
- git 同时连接云效平台和github
- IFS认证辅导,国际食品企业认证BRC和IFS起源和发展
- Apache Solr任意文件读取漏洞复现
- shell-判断两个ip是否在同一个网段
- Cadence手工创建PCB元件
- bank conflict
- Java SE基础(更新中)