Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ioc依赖注入问题 #238

Closed
jetablezhu opened this issue May 29, 2018 · 7 comments
Closed

Ioc依赖注入问题 #238

jetablezhu opened this issue May 29, 2018 · 7 comments

Comments

@jetablezhu
Copy link

hello,我看到源码中Ioc对bean的管理都是单例,static void injection(Ioc ioc, BeanDefine beanDefine)也是从容器中将已生成的实例注入目标字段,那就是说所有bean的字段都是单例的,那么BeanDefine中isSingle字段的意义是?如果需要每个请求一个实例bean,能支持么?

@hellokaton hellokaton self-assigned this May 29, 2018
@hellokaton
Copy link
Member

之前考虑过实现多实例,保留了一个字段,一直没想到场景。
如果每个请求实例化一个 bean 性能不好,实例化的过程是反射出来的,如果 Bean 的层级或本身比较大的话这块会比较慢,每次实例化的意义无非在于线程安全,这在低并发、流量小的情况下作用不大(因为内部每次会开线程处理请求)。

所以如果希望得到这个功能,需要给出一个充分的理由让所有的使用者、或大部分使用者受益,Blade 是愿意变得更好的 : )

@ccqy66
Copy link
Member

ccqy66 commented May 29, 2018

@biezhi 个人感觉还是有一定的使用场景,或许不是很场景。最近在做一个内部的框架,其中就使用到了容器内bean的多实例。但是这个多实例并不是每次请求都会创建的。会根据外部的配置参数,实例化一个bean,并根据外部的参数来进行初始化该bean。为了简化整个框架的使用,需要将动态创建的bean放置在容器中。这就需要保证该容器要兼容多实例的场景。

@jetablezhu
Copy link
Author

jetablezhu commented May 29, 2018

从性能考虑单例确实最优,spring默认也是单例。我是看到该字段没有使用所以问下,对于每次实例化的场景并不多。只是遇到服务层统计类似投票或评论数时,@Value 注入的属性会被多线程搞错的,这种场景只能改为无状态业务层(Bean不能有可修改的属性,要持久化到缓存或DB)。

@hellokaton
Copy link
Member

@ccqy66 如果配置在外部,事情就变得不简单了。如果 Blade 要做这个功能我觉得最好的方式还是在原有的注入注解上添加一个配置,再复杂的场景我认为可能不属于 IOC 的范畴了。我也使用 Go 的 web 框架是没有这种概念的,所以觉得这块不用做的特别多,实现可能很简单,带来的问题(引发内存溢出)不容小嘘。

@hellokaton
Copy link
Member

hellokaton commented May 29, 2018

@jetablezhu 提到的 @Value 是配置的注入,我不太明白为什么会有多线程问题,一般配置是只读的,如果不修改是不存在多线程问题的;如果会修改这个配置并且有并发的情况下会出现字段上的线程安全问题,这个框架本身不保证的,如果你的字段会存在并发写问题,建议在读取的时候硬编码读取配置。我觉得并发的场景用多例会使得内存的波动很大(也可能有CPU),这样不是很值得。

@ah-its-andy
Copy link

@biezhi 全局单例有很大的局限性,在依赖树的末端很难获得新的实例,使得执行一个并行任务变得十分困难。类似Java这种类型的语言,最大的优势就是高度灵活可扩展,Java的反射能力是Go望尘莫及的,但是Go的性能也是Java无论怎么优化都赶不上的。所以单例带来的少许性能提升意义并不是很大,不如每次请求都有新实例来的方便灵活。至少实例化对象的那一点点开销是完全可以接受的。

@hellokaton
Copy link
Member

hellokaton commented Nov 21, 2018

@standardcore 单例的局限性和它的优势是并存的,对于一个开发新手而言满项目乱创建对象造成的后果可能自己也无法解决,Java 语言和 Go 性能这事儿应该在并发层面比较为好,内存层面需要一些数据支撑。

按照各位以上的讨论,作为框架支持多例即可,默认情况下对象是单实例的,在想要多例的对象在注解上配置 singleton 为 false(这个字段在下一版本将加入)。

hellokaton added a commit that referenced this issue Nov 21, 2018
hellokaton added a commit that referenced this issue Nov 21, 2018
hellokaton added a commit that referenced this issue Nov 21, 2018
hellokaton added a commit that referenced this issue Nov 21, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants