文档章节

如何更好的在dropWizard使用IOC容器

 水底的泡泡鱼
发布于 2016/07/08 18:05
字数 777
阅读 128
收藏 0

##如何更好的在dropWizard使用IOC容器

###dropwizard介绍

dropWizard是由Yammer开发团队贡献的一个后台服务开发框架,其集成了Java生态系统中各个问题域中最优秀的组件,帮助开发者快速的打造一个Rest风格的后台服务。

对开发者来说,使用DropWizard有如下好处:

  • 和Maven集成良好,也就是说和Gradle集成也很良好;
  • 开发迅速,部署简单;
  • 代码结构好,可读性高;
  • 自动为服务提供OM框架;
  • 让开发者自然的把一个应用拆分为一个个的小服务 ####dropwizard的缺点

在实际的使用过程中,也遇到了一些使用上的不便,特别是在现在由微服务所构成的系统中,往往需要使用到各种中间件,如:mq,分布式缓存和分布式数据库等,但是各个中间件客户端的初始化过程却存在着很大的差别,如初始化activemq的(参考https://github.com/mbknor/dropwizard-activemq-bundle


    private ActiveMQBundle activeMQBundle;

    @Override
    public void initialize(Bootstrap<Config> configBootstrap) {

        // Create the bundle and store reference to it
        this.activeMQBundle = new ActiveMQBundle();
        // Add the bundle
        configBootstrap.addBundle(activeMQBundle);
    }

    @Override
    public void run(Config config, Environment environment) throws Exception {

        final String queueName = config.getQueueName();

        // Set up the sender for our queue
        ActiveMQSender sender = activeMQBundle.createSender( queueName, false);

        // Set up a receiver that just logs the messages we receive on our queue
        activeMQBundle.registerReceiver(
                queueName,
                (animal) -> log.info("\n*****\nWe received an animal from activeMq: \n{}\n*****", animal),
                Animal.class,
                true);

        // Create our resource
        environment.jersey().register( new AnimalResource(sender) );
    }

如果只是一个中间件的初始化,可能还会觉得没有太大的问题,但是如果要使用多个中间件,如果依赖的中间件客户端的初始化过程发现改变,虽然其使用接口并没有改变,则相关的微服务模块也都需要进行修改。而理想情况下,我们所开发的微服务,应该只会受其接口变化的影响。

###将dropwizard与IOC容器结合

目前dropwizard已经有了可以和spring和guice这两个著名的ioc容器相关结合的开源实现,但是由于dropwizard使用到了Jersey,而Jersey中就已经含有了一个HK2的IOC容器,dw-hk2-autoconf就是这样的一个项目,但是直接使用这个项目的实现,并不能完全达到实现一种“微内核+插件”的架构模式,其根本原因就是没有将dropwizard的Configuration对象进行相关的拆解,注入到HK2的IOC容器中,已经将dw-hk2-autoconf fork出来,增加了将Configuration进行分析的过程,基本就能实现“微内核+插件”的架构模式,主要的修改是在AutoConfigBundle.java中增加了registerSubConfigurationProvider方法

private void registerSubConfigurationProvider(final T configuration, final Environment environment) {
		final List<Field> subDeclaredFields = Arrays.asList(configuration.getClass().getDeclaredFields());
		
		
		final List<Field> subConfigFields = filterOutSubConf(subDeclaredFields);
		
		
		environment.jersey().register(new AbstractBinder() {
            @Override
            protected void configure() {
            	
            	for(Field subConfField:subConfigFields){
            		Object subConfig;
					try {
						subConfField.setAccessible(true);
						subConfig = subConfField.get(configuration);
						if(subConfig!=null){
	            			bind(subConfig);
	            		}
					} catch (IllegalArgumentException | IllegalAccessException e) {
						e.printStackTrace();
					}
            		
            	}
            	
                
            }
        });
		

	}

	private List<Field> filterOutSubConf(List<Field> subDeclaredFields) {
	
		List<Field> parentDeclaredFields = Arrays.asList(Configuration.class.getDeclaredFields());
		List<Field> resultFields = new ArrayList<>();
		for(Field subField:subDeclaredFields){
			if(subField.getType().isPrimitive()){
				continue;
			}
			
			if(subField.getType().equals(String.class)){
				continue;
			}
			
			if(parentDeclaredFields.contains(subField)){
				continue;
			}
			resultFields.add(subField);
		}
		return resultFields;
	}

© 著作权归作者所有

粉丝 1
博文 1
码字总数 777
作品 0
成都
高级程序员
私信 提问
spring技术内幕读书笔记之IoC容器的学习

第一篇:概念和设计原理 IoC容器的实现作为Spring的核心内容之一非常有必要拿来研究一下 1、概念 IoC(Inversion of Control,控制反转)必须思考的问题:哪些方面的控制被反转了? 对于这个...

CTO搬砖达人
2017/08/03
0
0
微服务 Dropwizard 配置 服务调用

调用另一个服务 在微服务环境中,每个服务负责向其他协作者提供功能或服务。如果我们希望扩展“HelloWorld”微服务,我们将需要创建一个可以使用Drop向导的REST客户端功能调用的服务。就像我...

woshixin
2018/05/08
137
0
浅析 Spring IoC - 基础概念

IoC是什么? IoC(Inversion of Control)即控制反转,不是什么技术,而是一种设计思想。在Java开发中,IoC 意味着将你设计好的对象交给容器去控制,而不是传统的在对象内部直接控制(比如说...

pradosoul
2015/10/15
214
0
Spring之旅第二篇-Spring IOC概念及原理分析

一、IOC概念 上一篇已经了解了spring的相关概念,并且创建了一个Spring项目。spring中有最重要的两个概念:IOC和AOP,我们先从IOC入手。 IOC全称Inversion of Control,中文通常翻译为“控制...

花漾年华
04/30
27
0
最好的8个Java RESTful框架

过去的每一year,涌现出越来越多的Java框架。就像JavaScript,每个人都认为他们知道一个好的框架的功能应该是怎么样的。连我的老祖母现在也使用 一个我从来没有听说过而且可能永远不会使用的...

李景枫
2016/05/03
8.8K
27

没有更多内容

加载失败,请刷新页面

加载更多

maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
今天
8
0
Linux创建yum仓库

第一步、搞定自己的光盘 #创建文件夹 mkdir -p /media/cdrom #挂载光盘 mount /dev/cdrom /media/cdrom #编辑配置文件使其永久生效 vim /etc/fstab 第二步,编辑yun源 vim /ect yum.repos.d...

究极小怪兽zzz
今天
6
0
jar 更新部分文件

C:\Program Files (x86)\Java\jdk1.8.0_102\bin>jar -hIllegal option: hUsage: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ...Options: -c c......

圣洁之子
今天
9
0
OSChina 周六乱弹 —— 感谢女装红薯开办了这个网站

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @胖达panda:分享歌词: 我有一只小毛驴我从来也不骑,有一天我心血来潮骑着去赶集,我手里拿着小皮鞭我心里正得意,不知怎么哗啦啦,我摔了一...

小小编辑
今天
2.6K
13
DDD(四)

1,引言 软件开发者大多趋向于将关注点放在数据上,而不是领域上。这对于刚入门的DDD的新手而言也是如此。以我目前的思考方式,数据库依然占据主要的地位。开发一个功能,首先我就会考虑我会...

MrYuZixian
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部