Spring-Boot中有很多Enable开头的注解,通过添加注解来开启一项功能,如

其原理是什么?如何开发自己的Enable注解?

1.原理

以@EnableScheduling为例,查看其源码,发现添加了一个@Import注解

继续查看@Import注解源码,发现其是由Spring提供的,用来导入配置类的,在配置类中定义的Bean(@Bean),可通过@Autowired注入到容器中,也就是可以被扫描到

2.自定义

了解了Enable注解的原理,我们就可以开发自己的Enable注解了,下面的例子实现了通过@Enable注解方式开启服务器负载监控的功能

2.1 定义定时任务类

package com.yc.dudu.common.monitor;

import com.alibaba.fastjson.JSONObject;
import com.sun.management.OperatingSystemMXBean;
import com.yc.dudu.common.constant.CommonConstants;
import com.yc.dudu.common.util.DateTimeUtil;
import com.yc.dudu.common.vo.ServerMonitorInfo;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled; import java.io.File;
import java.lang.management.ManagementFactory;
import java.net.InetAddress;
import java.net.UnknownHostException; /**
* 收集服务器负载信息
*
* @author zhya
* @date 2018/9/20
**/
@Slf4j
@EnableScheduling
public class ServerLoadMonitorRunner implements CommandLineRunner {
/**
* 自定义log,输出服务器负载信息到日志文件
*/
private static final Logger monitorLog = LoggerFactory.getLogger("serverMonitorLog"); /**
* 系统信息
*/
private static final OperatingSystemMXBean mem = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); /**
* 收集服务器负载信息并输出到日志文件
*/
@Scheduled(cron = "*/5 * * * * ?")
public void collectServerSystemLoad() {
try {
// 输出json格式的信息到文件
monitorLog.info(JSONObject.toJSONString(new ServerMonitorInfo(InetAddress.getLocalHost().getHostName(),
String.valueOf(mem.getFreePhysicalMemorySize() / CommonConstants.BYTES_TO_MB),
String.valueOf(mem.getSystemCpuLoad()),
String.valueOf(File.listRoots()[0].getFreeSpace() / CommonConstants.BYTES_TO_MB),
DateTimeUtil.getNowDateTimeStr())));
} catch (UnknownHostException e) {
log.error(e.getMessage());
}
} /**
* Callback used to run the bean.
*
* @param args incoming main method arguments
* @throws Exception on error
*/
@Override
public void run(String... args) throws Exception {
try {
collectServerSystemLoad();
} catch (Exception e) {
log.error(e.getMessage());
// 不做处理,继续运行
}
}
}

  

2.2 定义配置类,其中声明定时任务Bean

package com.yc.dudu.common.monitor;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import javax.annotation.PostConstruct; /**
* 服务器负载监控自动配置类
*
* @author zhya
* @date 2018/09/20
**/
@Configuration
public class ServerLoadMonitorAutoConfig {
/**
* 是否开启监控配置参数
*/
@Value("${monitor.server.enabled:}")
private String enabledConfig; /**
* 错误提醒
*/
@PostConstruct
protected void init() {
if (StringUtils.isBlank(enabledConfig)) {
System.err.println("~~~Please config the monitor.server.enabled property in application.yml file to enable server monitor function~~~");
}
} /**
* 根据运行环境决定是否开启服务器负载信息监控
*
* @return
*/
@Bean
@ConditionalOnProperty(prefix = "monitor.server", name = "enabled", havingValue = "true")
protected ServerLoadMonitorRunner startServerMonitor() {
return new ServerLoadMonitorRunner();
}
}

2.3 定义自己的Enable注解,Import 配置类

package com.yc.dudu.common.monitor;

import org.springframework.context.annotation.Import;

import java.lang.annotation.*;

/**
* 服务器负载监控开启注解
*
* @author zhya
* @date 2018/09/20
**/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(ServerLoadMonitorAutoConfig.class)
@Documented
@Inherited
public @interface EnableServerLoadMonitor {
}

2.4 使用自定义的EnableServerLoadMonitor注解,配合着配置参数,就可以开启服务器负载监控功能了

package com.yc.dudu.gate.admin;

import com.yc.dudu.auth.client.EnableDuduAuthClient;
import com.yc.dudu.common.monitor.EnableServerLoadMonitor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import zipkin2.Span;
import zipkin2.reporter.Reporter; /**
* admin网关启动类
*
* @author zhya
* @date 2018/9/20
**/
@EnableHystrix
@EnableServerLoadMonitor
@SpringBootApplication
@EnableDiscoveryClient
@EnableDuduAuthClient
@EnableFeignClients({"com.yc.dudu.auth.client.feign", "com.yc.dudu.gate.admin.feign"})
public class AdminGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(AdminGatewayApplication.class, args);
System.out.println("AdminGatewayApplication is started!~~~~~~~~");
} /**
* 链路跟踪信息输出log
*/
private static Logger sleuthLog = LoggerFactory.getLogger("sleuthLog"); /**
* 将链路跟踪信息输出到日志文件
*
* @return
*/
@Bean
public Reporter<Span> spanReporter() {
Reporter<Span> reporter = span -> sleuthLog.info(span.toString());
return reporter;
}
}

  

自定义Spring-Boot @Enable注解的更多相关文章

  1. Spring Boot @Enable*注解源码解析及自定义@Enable*

      Spring Boot 一个重要的特点就是自动配置,约定大于配置,几乎所有组件使用其本身约定好的默认配置就可以使用,大大减轻配置的麻烦.其实现自动配置一个方式就是使用@Enable*注解,见其名知 ...

  2. 自定义spring boot starter 初尝试

    自定义简单spring boot starter 步骤 从几篇博客中了解了如何自定义starter,大概分为以下几个步骤: 1 引入相关依赖: 2 生成属性配置类: 3 生成核心服务类: 4 生成自动 ...

  3. Spring Boot常用注解总结

    Spring Boot常用注解总结 @RestController和@RequestMapping注解 @RestController注解,它继承自@Controller注解.4.0之前的版本,Spr ...

  4. Spring Boot 常用注解汇总

    一.启动注解 @SpringBootApplication @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documen ...

  5. 3个Spring Boot核心注解,你知道几个?

    Spring Boot 核心注解讲解 Spring Boot 最大的特点是无需 XML 配置文件,能自动扫描包路径装载并注入对象,并能做到根据 classpath 下的 jar 包自动配置. 所以 S ...

  6. Spring Boot@Component注解下的类无法@Autowired的问题

    title: Spring Boot@Component注解下的类无法@Autowired的问题 date: 2019-06-26 08:30:03 categories: Spring Boot t ...

  7. Spring boot 基于注解方式配置datasource

    Spring boot 基于注解方式配置datasource 编辑 ​ Xml配置 我们先来回顾下,使用xml配置数据源. 步骤: 先加载数据库相关配置文件; 配置数据源; 配置sqlSessionF ...

  8. 自定义spring boot的自动配置

    文章目录 添加Maven依赖 创建自定义 Auto-Configuration 添加Class Conditions 添加 bean Conditions Property Conditions Re ...

  9. 【SpringBoot】15. Spring Boot核心注解

    Spring Boot核心注解 1 @SpringBootApplication 代表是Spring Boot启动的类 2 @SpringBootConfiguration 通过bean对象来获取配置 ...

  10. spring boot纯注解开发模板

    简介 spring boot纯注解开发模板 创建项目 pom.xml导入所需依赖 点击查看源码 <dependencies> <dependency> <groupId& ...

随机推荐

  1. js 动态获取高度 设置距离

    var boxs = document.getElementById('m2-head');var Height = boxs.clientHeight||o.offsetHeight;console ...

  2. UVA - 10829 L-Gap Substrings (后缀自动机+线段树启发式合并)

    题意:统计一段字符串中形如UVU的子串个数(其中V的长度固定为g). 问题等价于求满足$g+1\leqslant |j-i|\leqslant g+LCP(i,j)$的后缀(i,j)的对数,即$\su ...

  3. Kendo UI for jQuery使用教程:使用MVVM初始化(一)

    [Kendo UI for jQuery最新试用版下载] Kendo UI目前最新提供Kendo UI for jQuery.Kendo UI for Angular.Kendo UI Support ...

  4. mahout从入门到放弃--安装(1)

    1.稀里糊涂下载 我的集群是hadoop 2.7.3 ,本来想找到对应的mahout版本,但是没有找到.本着安全原则,mahout最新版本是0.14.0,回退一个版本使用0.13.0 mahout地址 ...

  5. 动软代码生成器生成model

    model <#@ template language="c#" HostSpecific="True" #> <#@ output exte ...

  6. zabbix监控win服务器

    https://jingyan.baidu.com/article/fcb5aff76486f2edaa4a712a.html 卸载win上的zabbix: cmd /c "C:\zabbi ...

  7. JavaScript 正则表达式——定义,目的,特点,语法,字符串方法,search() ,replace() ,test(),exec()

    ㈠什么是正则表达式? ⑴正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.    正则表达式通常被用来检 ...

  8. head first 设计模式笔记5-单例模式

    目录: 1.单例模式(Singleton Pattern) 2.概念 3.饿汉式:不是延迟加载,加载类的时候直接初始化 4.懒汉式:延迟加载,首次需要使用的时候在实例化,需要考虑线程安全 5.静态内部 ...

  9. poj 2559 Largest Rectangle(单调栈)

    Largest Rectangle in a Histogram Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 26549 ...

  10. 哈密尔顿环x

    欧拉回路是指不重复地走过所有路径的回路,而哈密尔顿环是指不重复地走过所有的点,并且最后还能回到起点的回路.  代码如下: #include<iostream> #include<cs ...