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;
}
}

  

最新文章

  1. Delphi XE7中各种字符串与字符类型的内存结构
  2. 异步方法不能使用ref和out的解决方法
  3. zDiaLog弹出层
  4. 什么是java path环境变量
  5. 把浏览器的私有模式添加到VS中
  6. paip.java c++得到当前类,方法名称以及行号
  7. golang 图片处理,剪切,base64数据转换,文件存储
  8. Groovy安装配置
  9. something: 重构、正则、vim -- clwu
  10. ibatis中isEquals、isNotEmpty的用法
  11. java ,js获取web工程路径
  12. 使用ASP在IIS创建WEB站点的函数
  13. C题 - A+B for Input-Output Practice (II)
  14. sqlserver 数据库里面金额类型为什么不建议用float,实例告诉你为什么不能。
  15. PHP并发最佳实践
  16. iOS_UIButton 简单操作
  17. Java数据结构和算法 - OverView
  18. React组件和生命周期简介
  19. JVM自动内存管理机制——Java内存区域(下)
  20. Ulua_toLua_基本案例(八)_LuaAccessingArray

热门文章

  1. SpringBoot 在IDEA中实现热部署(实用版)(引入)
  2. DevExpress ASP.NET Core v19.1版本亮点:数据网格和树列表
  3. dede 调取二级三级菜单栏目
  4. 如何理解Hibernate的延迟加载机制?
  5. k8s命令自动补全
  6. ubuntu+tomcat+jenkins+git+maven
  7. NOI 2019 AFO 记
  8. CodeForces&ndash;471D--MUH and Cube Walls(KMP)
  9. Codeforces Round #201 (Div. 2). E--Number Transformation II(贪心)
  10. Unity3D_(游戏)2D坦克大战 像素版