Java使用@EnableEurekaServer实现自动装配详解

目录
  • 实践
  • @EnableEurekaServer
  • @EnableWebConfigure
  • 设计价值

实践

仿照@EnableEurekaServer实现自动装配

如果你使用过Eureka作为微服务的注册中心,那么对@EnableWebConfigure一定很了解,该注解用来开启Eureka服务端作为微服务的注册中心,其背后是springboot自动装配原理。

本次,将仿照此设计思路,完成Web应用统一异常处理、TraceId链路日志追踪、Json序列化消息处理器等通用能力的自动装配。

@EnableEurekaServer

通过源码我们得知,此注解的源码如下

/**
 * Annotation to activate Eureka Server related configuration.
 * {@link EurekaServerAutoConfiguration}
 *
 * @author Dave Syer
 * @author Biju Kunjummen
 *
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(EurekaServerMarkerConfiguration.class)
public @interface EnableEurekaServer {
}

那么,如何通过在启动类标识此注解即可实现EurekaServer的自动装配呢?

答案其实在这一句

@Import(EurekaServerMarkerConfiguration.class)

该注解使用了@Import注解导入了一个配置类 EurekaServerMarkerConfiguration.java,该配置类源码如下

@Configuration(proxyBeanMethods = false)
public class EurekaServerMarkerConfiguration {
	@Bean
	public Marker eurekaServerMarkerBean() {
		return new Marker();
	}
	class Marker {
	}
}

我们看到,该配置类声明了一个Bean 内部类Marker

那么,为什么声明这个类?这个类看起来没有任何属性和方法

我们在导入的EurekaServer包中继续寻找答案

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

通过Command + 单击 Marker类,我们看到了如下引用

@ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class)

可以发现,一个条件装配使用了这个类,该注解的含义是当上下文中有Marker实例时,进行注解所在配置类的装配,也就是 EurekaServerAutoConfiguration

通过查看其源码,可以看到大量的EurekaServer相关Bean声明,也就是说,实现了EurekaServerAutoConfiguration的装配,也就实现类EurekaServer的装配

好的,思路清晰了 通过@EnableEurekaServer来导入EurekaServerMarkerConfiguration,进而将内部类Marker实例化到spring上下文中,通过条件装配,再来装配EurekaServerAutoConfiguration配置文件

也就是说 内部类Marker 起到了一个开关的作用

接下来只剩最后一个问题,我们只写了一行代码,也就是 @EnableEurekaServer 加到了springboot启动类上,那么 EurekaServerAutoConfiguration 是怎样被识别并导入到我们自己的项目中呢?

涉及到另一个知识点 spring.factories 它可以实现,将我们编写的jar包中的配置类,能够被依赖方识别到。

关于这点请自行百度查阅前置知识,只要理解它的作用,代码其实很简单。关于这点多说一下,许久之前我曾经有过疑惑,就是我编写的Common包其中包含了使用spring注解@Component、@Service、@Controller等修饰的Bean,那么引入这个jar包的spring工程,如何能够将

这个Bean注入到spring上下文中呢,使用@ComponentScan扫描,显然勉强能够实现,但是如果所有引入的工程都去改写@ComponentScan 显然不现实,spring.factories就可以灵活的实现该需求,自动的将配置进行导入

@EnableWebConfigure

@EnableWebConfigure 是我自定义的注解,期望用它来自动开启Web相关的公共能力,实现如下:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(WebMarkerConfiguration.class)
public @interface EnableWebConfigure {
}

注解标识在启动类上即可,它并没有属性和方法,仅导入了另一个配置类 WebMarkerConfiguration.class

@Configuration
public class WebMarkerConfiguration {
    @Bean
    public Marked createMarkedInstance(){
        return new Marked();
    }
    class Marked{
    }
}

可以看到,我很懒,连名字都跟EurekaServer中的实现一样…

而引用此Marked标识的是配置类 InternalCommonBeanConfiguration

@Configuration
@Import({WebConfig.class, WebMvcConfig.class})
@ConditionalOnBean(WebMarkerConfiguration.Marked.class)
public class InternalCommonBeanConfiguration {
    @Bean
    public GlobalExceptionInterceptor createGlobalExceptionInterceptor(){
        // 全局异常处理
        return new GlobalExceptionInterceptor();
    }
    @Bean
    public TransIdFilter createTransIdFilter(){
        // TraceId 过滤器
        return new TransIdFilter();
    }
}

类中除了声明GlobalExceptionInterceptor以及TransIdFilter,还导入了@Import({WebConfig.class, WebMvcConfig.class}) 这两个类用来配合@ResponseBody或者@RestController实现JSON序列化

最后,通过在internal-common工程resource文件下,新建 META-INF/spring.factories 文件,来暴露InternalCommonBeanConfiguration,以方便其他项目能够在依赖时,自动导入。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  org.sun.online.internalcommon.configure.InternalCommonBeanConfiguration

具体工程中的应用请见 org.sun.online.serviceverificationcode.ServiceVerificationCodeApplication

设计价值

依赖方:后续的Web服务工程中,只需要@EnableWebConfigure 即可获得相应的通用能力

被依赖方:通过拓展 InternalCommonBeanConfiguration 即可令所有依赖方无需代码改动直接获得支持,方便升级维护

到此这篇关于Java使用@EnableEurekaServer实现自动装配详解的文章就介绍到这了,更多相关Java @EnableEurekaServer内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 深入了解Java SpringBoot自动装配原理

    目录 自动装配原理 SpringBootApplication EnableAutoConfiguration AutoConfigurationImportSelector 总结 在使用springboot时,很多配置我们都没有做,都是springboot在帮我们完成,这很大一部分归功于springboot自动装配,那springboot的自动装配的原理是怎么实现的呢? 自动装配原理 springboot 版本:2.4.3 SpringBootApplication springboot启动类

  • Java注解机制之Spring自动装配实现原理详解

    Java中使用注解的情况主要在SpringMVC(Spring Boot等),注解实际上相当于一种标记语言,它允许你在运行时动态地对拥有该标记的成员进行操作.注意:spring框架默认不支持自动装配的,要想使用自动装配需要修改spring配置文件中<bean>标签的autowire属性. 自动装配属性有6个值可选,分别代表不同的含义: byName ->从Spring环境中获取目标对象时,目标对象中的属性会根据名称在整个Spring环境中查找<bean>标签的id属性值.如果

  • Java SpringBoot自动装配原理详解及源码注释

    目录 一.pom.xml文件 1.父依赖 2.启动器: 二.主程序: 剖析源码注解: 三.结论: 一.pom.xml文件 1.父依赖 主要是依赖一个父项目,管理项目的资源过滤以及插件! 资源过滤已经配置好了,无需再自己配置 在pom.xml中有个父依赖:spring-boot-dependencies是SpringBoot的版本控制中心! 因为有这些版本仓库,我们在写或者引入一些springboot依赖的时候,不需要指定版本! 2.启动器: 启动器也就是Springboot的启动场景; 比如sp

  • Java Springboot自动装配原理详解

    目录 Debug路线图 让我们从run说起 归属 小结 run 再说说注解 总结 Debug路线图 说多都是泪,大家看图. 让我们从run说起 用了这么多年的的Springboot,这个 run() 方法到底做了些什么事呢? @SpringBootApplication public class SpringbootDemoApplication { public static void main(String[] args) { SpringApplication.run(Springboot

  • 一篇文章教带你了解Java Spring之自动装配

    目录 在Spring中有三种装配的方式: 1.Bean的自动装配 1.1 autowire="byName" 实现自动装配 1.2 autowire="byType" 实现自动装配 2.注解实现自动装配 2.1 配置注解 2.2 @Autowired注解 2.3 @Resource注解 2.4小结 3.介绍一个idea中做笔记的小技巧 总结 在Spring中有三种装配的方式: 在xml中显示的配置 在java中显示配置 隐式的自动装配bean 1.Bean的自动装配

  • Java使用@EnableEurekaServer实现自动装配详解

    目录 实践 @EnableEurekaServer @EnableWebConfigure 设计价值 实践 仿照@EnableEurekaServer实现自动装配 如果你使用过Eureka作为微服务的注册中心,那么对@EnableWebConfigure一定很了解,该注解用来开启Eureka服务端作为微服务的注册中心,其背后是springboot自动装配原理. 本次,将仿照此设计思路,完成Web应用统一异常处理.TraceId链路日志追踪.Json序列化消息处理器等通用能力的自动装配. @Ena

  • Springboot框架实现自动装配详解

    目录 序言 从程序的使用去入手分析 序言 springboot框架价值,可以简单快速的构建独立的spring生产级别应用.springboot主要有以下的特性: 1.创建独立的Spring应用 2.直接嵌入Tomcat等Web容器(不需要部署WAR文件) 3.提供固化的“starter”依赖,简化构建配置 4.当条码满足时自动装配Spring货第三方类库 5.提供运维的特性,如指标信息,健康检查和外部配置 6.不需要XML配置. 下面就以springboot启动的时候,是如何实现mybatis自

  • spring入门教程之bean的继承与自动装配详解

    Spring之Bean的基本概念 大家都知道Spring就是一个大型的工厂,而Spring容器中的Bean就是该工厂的产品.对于Spring容器能够生产那些产品,则取决于配置文件中配置. 对于我们而言,我们使用Spring框架所做的就是两件事:开发Bean.配置Bean.对于Spring矿建来说,它要做的就是根据配置文件来创建Bean实例,并调用Bean实例的方法完成"依赖注入". Bean的定义 <beans-/>元素是Spring配置文件的根元素,<bean-/&

  • java编程中自动拆箱与自动装箱详解

    什么是自动装箱拆箱 基本数据类型的自动装箱(autoboxing).拆箱(unboxing)是自J2SE 5.0开始提供的功能. 一般我们要创建一个类的对象实例的时候,我们会这样: Class a = new Class(parameter); 当我们创建一个Integer对象时,却可以这样: Integer i = 100; (注意:不是 int i = 100; ) 实际上,执行上面那句代码的时候,系统为我们执行了:Integer i = Integer.valueOf(100); (感谢@

  • 你所不知道的Spring自动注入详解

    自动注入和@Autowire @Autowire不属于自动注入! 注入方式(重要) 在Spring官网上(文档),定义了在Spring中的注入方式一共有两种:set方法和构造函数. 也就是说,你想在A类里面注入另外一个B类,无论你是通过写 XML文件,或者通过 @Autowried,他们最终都是通过这个A类的set方法或者构造函数,将B类注入到A类中! 换句话说,你如果A类里面没有setB(B b){-},那你就别想通过set方法把B类注入到A类中 自动注入 首先摆出一个比较颠覆的观点:@Aut

  • Java nacos动态配置实现流程详解

    目录 一.前言 二.在nacos上创建配置文件 创建配置文件 配置说明 发布并检查配置文件 三. 修改项目配置与动态读取配置文件 添加 nacos 动态配置依赖 在controller与service中使用动态配置 四. 动态配置网关的使用 一.前言 使用动态配置的原因: properties 和 yaml 是写到项目中的,好多时候有些配置需要修改,每次修改就要重新启动项目,不仅增加了系统的不稳定性,也大大提高了维护成本,非常麻烦,且耗费时间. 使用动态配置,则可以避免这些麻烦,可以动态的修改配

  • classloader类加载器_基于java类的加载方式详解

    基础概念 Classloader 类加载器,用来加载 Java 类到 Java 虚拟机中.与普通程序不同的是.Java程序(class文件)并不是本地的可执行程序.当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader. JVM本身包含了一个ClassLoader称为Bootstrap ClassLoader,和JVM一样,BootstrapClassLoader是用本地代码实现

  • Java实现LRU缓存的实例详解

    Java实现LRU缓存的实例详解 1.Cache Cache对于代码系统的加速与优化具有极大的作用,对于码农来说是一个很熟悉的概念.可以说,你在内存中new 了一个一段空间(比方说数组,list)存放一些冗余的结果数据,并利用这些数据完成了以空间换时间的优化目的,你就已经使用了cache. 有服务级的缓存框架,如memcache,Redis等.其实,很多时候,我们在自己同一个服务内,或者单个进程内也需要缓存,例如,lucene就对搜索做了缓存,而无须依赖外界.那么,我们如何实现我们自己的缓存?还

  • java中的interface接口实例详解

     java中的interface接口实例详解 接口:Java接口是一些方法表征的集合,但是却不会在接口里实现具体的方法. java接口的特点如下: 1.java接口不能被实例化 2.java接口中声明的成员自动被设置为public,所以不存在private成员 3.java接口中不能出现方法的具体实现. 4.实现某个接口就必须要实现里面定义的所有方法. 接下来看一个实现接口的案例: package hello;   interface competer{ //定义接口 void set_comp

  • 多用多学之Java中的Set,List,Map详解

    很长时间以来一直代码中用的比较多的数据列表主要是List,而且都是ArrayList,感觉有这个玩意就够了.ArrayList是用于实现动态数组的包装工具类,这样写代码的时候就可以拉进拉出,迭代遍历,蛮方便的. 也不知道从什么时候开始慢慢的代码中就经常会出现HashMap和HashSet之类的工具类.应该说HashMap比较多一些,而且还是面试经典题,平时也会多看看.开始用的时候简单理解就是个键值对应表,使用键来找数据比较方便.随后深入了解后发现 这玩意还有点小奥秘,特别是新版本的JDK对Has

随机推荐