文档章节

创建注入框架(4)

legen_wait_dary
 legen_wait_dary
发布于 2016/10/28 19:23
字数 280
阅读 7
收藏 1

我们尚未解决的问题有两个,第一是scope,第二是Qualifier,先解决scope。 关于scope,我的思路是给原有的provider加一层wrapper,采用包装器模式(或者叫装饰模式),因为没涉及到web,所以这里只考虑Singleton。 先写一个singleton的provider,如下:

public class SingletonProvider<T> implements Provider<T> {

    private Provider<T> originProvider;
    private boolean get = false;
    private T result = null;

    public SingletonProvider(Provider<T> originProvider) {
        this.originProvider = originProvider;
    }

    @Override
    public T get() {
        if (!get && result == null) {
            get = true;
            result = originProvider.get();
        }
        return result;
    }
}

注意,这个类很简陋,没考虑线程安全等问题。 _binder这个类做些小修改, 修改后的_binder:

public class _binder<T> {

    private Binder<T> binder;
    private String name = Binder.DEFAULT_BIND_NAME;

    private boolean singleton;

    _binder(Binder<T> binder) {
        this.binder = binder;
    }

    private void setName(String name) {
        this.name = name;
    }

    public _binder<T> named(String name) {
        setName(name);
        return this;
    }

    public _binder<T> singleton(boolean singleton) {
        this.singleton = singleton;
        return this;
    }

    public _binder<T> providedBy(Provider<T> provider) {
        if (singleton) {
            provider = new SingletonProvider<>(provider);
        }
        binder.bind(name,provider);
        return this;
    }

    public <K extends T> _binder<T> instanceOf(Class<K> impl) {
        if (impl.isAnnotationPresent(Named.class)) {
            Named named = impl.getAnnotation(Named.class);
            this.named(named.value());
        }
        if (impl.isAnnotationPresent(Singleton.class)) {
            this.singleton(true);
        }
        return providedBy(new ParseClass<>(binder.gettClass(),impl,Container.this));
    }

}

这些文章也同步到了我自己的公众号平台:互联网科技杂谈

© 著作权归作者所有

legen_wait_dary
粉丝 0
博文 10
码字总数 6658
作品 0
荆州
私信 提问
MEF 插件式开发 - DotNetCore 中强大的 DI

目录 背景叙述 动手实验 注入并设置服务的生命周期 构造函数注入 添加日志记录 总结 相关参考 背景叙述 在前面几篇 MEF 插件式开发 系列博客中,我分别在 和 两种框架下实验了 MEF 的简单实验...

hippieZhou
2018/08/14
0
0
Spring|Spring概述

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/darlingwood2013/article/details/89374446 Spring|Spring概述 Spring 介绍 Spring 是一个分层的JavaSE/EE f...

叶晚林
04/19
0
0
搭建你的Spring.Net+Nhibernate+Asp.Net Mvc 框架 (六)写在后面的话

如果在你的项目中,配置的没有报错,但是总是注入进来的都是null的话,可查看配置文件所在的项目是否添加了配置文件中所引用或配置了的项目。还有就是mvc中control中注入都失败了。这个最后还...

aicoder
2010/09/07
0
0
依赖注入[5]: 创建一个简易版的DI框架[下篇]

为了让读者朋友们能够对.NET Core DI框架的实现原理具有一个深刻而认识,我们采用与之类似的设计构架了一个名为Cat的DI框架。在《依赖注入[4]: 创建一个简易版的DI框架[上篇]》中我们介绍了C...

Artech
2018/07/31
0
0
01-SpringIoC&DI-授课

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/qq39817135/article/details/97500418 1. spring概述 1.1 Spring是什...

春哥的技术还不行
09/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS 7系统增加swap

转载请注明文章出处:CentOS 7系统增加swap swap是位于磁盘上的特殊文件(或分区),属于“虚拟内存”的一部分。通俗点就是内存的备胎,内存充足的情况下,基本上没swap什么事(和设置有关)...

tlanyan
16分钟前
2
0
基于Prometheus和Grafana的监控平台 - 环境搭建

相关概念 微服务中的监控分根据作用领域分为三大类,Logging,Tracing,Metrics。 Logging - 用于记录离散的事件。例如,应用程序的调试信息或错误信息。它是我们诊断问题的依据。比如我们说...

JAVA日知录
56分钟前
5
0
PHP运行时全局构造体

struct _php_core_globals { zend_bool magic_quotes_gpc; // 是否对输入的GET/POST/Cookie数据使用自动字符串转义。 zend_bool magic_quotes_runtime; //是否对运行时从外部资源产生的数据使...

冻结not
57分钟前
4
0
webpack插件html-webpack-plugin

本文转载于:专业的前端网站→webpack插件html-webpack-plugin 1、插件安装 npm install html-webpack-plugin --save-dev 2、插件使用 webpack.config.js配置文件为: var htmlWebpackPlugin=...

前端老手
今天
6
0
数据挖掘

zhengchen1996
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部