SpringBoot2.1.x,创建自己的spring

网友投稿 364 2022-11-22


SpringBoot2.1.x,创建自己的spring

一)spring-boot-starter命名规则

自动配置模块命名规则:xxx-spring-boot,如:aspectlog-spring-boot

启动器命名规则:xxx-spring-boot-starter,如:aspectlog-spring-boot-starter

如两者只有一个模块:建议以xxx-spring-boot-starter方式命名。

springboot建议以xxx前缀的方式对自己的自动配置命名的。

二)spring-boot-starter条件注解

注解

说明

@ConditionalOnClass

指定加载的类

@ConditionalOnMissingClass

指定不加载的类

@ConditionalOnBean

指定需要加载的bean

@ConditionalOnMissingBean

指定不需要加载的bean

@ConditionalOnProperty

指定加载配置文件中的属性,如yml或properties文件

@ConditionalOnResource

检查特定的资源是否存在,如:file:/home/user/test.dat

@ConditionalOnExpression

使用SpEL表达式

该文章使用@ConditionalOnProperty注解实现。

三)创建自己的aspectlog-spring-boot-starter日志打印自动配置模块

第一步:创建一个aspectlog-spring-boot-starter名称的maven项目

在pom.xml文件中引入springboot相应jar

4.0.0

com.oysept

aspectlog-spring-boot-starter

0.0.1-SNAPSHOT

org.springframework.boot

spring-boot-starter-parent

2.1.4.RELEASE

1.8

org.springframework.boot

spring-boot-autoconfigure

org.springframework.boot

spring-boot-starter-aop

org.springframework.boot

spring-boot-configuration-processor

true

spring-boot-configuration-processor作用:会在源数据文件(META-INF/spring-autoconfigure-metadata.properties)中自动扫描加载和自动配置有关的条件。也就是说,当编写starter时,会读取自动配置的条件,写入源数据文件中。

第二步:定义一个AspectLog注解类

该注解作用于方法上,并在运行时启用

package com.oysept.autoconfiguration.aspectlog;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

public @interface AspectLog {

igDyrIGxX

}

第三步:创建一个AspectLogProperties类,用于加载yml或properties中的属性

package com.oysept.autoconfiguration.aspectlog;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties("aspectlog")

public class AspectLogProperties {

private boolean enable;

public boolean isEnable() {

return enable;

}

public void setEnable(boolean enable) {

this.enable = enable;

}

}

第四步:创建一个AspectLogAutoConfiguration打印日志自动配置类

package com.oysept.autoconfiguration.aspectlog;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.Around;

import org.aspectj.lang.annotation.Aspect;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.EnableAspectJAutoProxy;

import org.springframework.core.PriorityOrdered;

@Aspect

@EnableAspectJAutoProxy(exposeProxy = true, proxyTargetClass = true)

@Configuration

@ConditionalOnProperty(prefix="aspectlog", name = "enable", havingValue = "true", matchIfMissing = true)

public class AspectLogAutoConfiguration implements PriorityOrdered {

protected Logger logger = LoggerFactory.getLogger(getClass());

@Around("@annotation(com.oysept.autoconfiguration.aspectlog.AspectLog) ")

public Object isOpen(ProceedingJoinPoint thisJoinPoint) throws Throwable {

//执行方法名称

String taskName = thisJoinPoint.getSignature()

.toString().substring(

thisJoinPoint.getSignature()

.toString().indexOf(" "),

thisJoinPoint.getSignature().toString().indexOf("("));

taskName = taskName.trim();

long time = System.currentTimeMillis();

Object result = thisJoinPoint.proceed();

logger.info("==>aspectlog method:{} run :{} ms", taskName, (System.currentTimeMillis() - time));

return result;

}

@Override

public int getOrder() {

//保证事务等切面先执行

return Integer.MAX_VALUE;

}

}

注解说明:

@ConditionalOnProperty(prefix = "aspectLog", name = "enable",havingValue = "true", matchIfMissing = true)

当yml或properties配置文件中有aspectLog.enable=true时开启,如果配置文件没有设置aspectLog.enable也开启。

第五步:创建spring.factories文件,该文件是springboot规定的配置文件,把自动配置类按规则配置

先在src/main/resources下创建一个META-INF文件夹,然后在文件夹下创建spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\

com.oysept.autoconfiguration.aspectlog.AspectLogAutoConfiguration

META-INF/spring.factories是spring的工厂机制,在这个文件中定义的类,都会被自动加载。多个配置使用逗号分割,换行用\

第六步:使用mvn install方式把该模块自动打包

四)测试aspectlog-spring-boot-starter打印日志配置

另外创建一个springboot_starter_test名称的maven项目

在pom中引入aspectlog-spring-boot-starter的jar

4.0.0

com.oysept

springboot_starter_test

0.0.1-SNAPSHOT

jar

org.springframework.boot

spring-boot-starter-parent

2.1.4.RELEASE

1.8

org.springframework.boot

spring-boot-starter-web

com.oysept

aspectlog-spring-boot-starter

0.0.1-SNAPSHOT

org.springframework.boot

spring-boot-maven-plugin

创建一个application.yml,配置启动的端口,默认是8080

server:

port: 8080

创建application启动类

package com.oysept;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class TestSpringBootStarterApplication {

public static void main(String[] args) {

SpringApplication.run(TestSpringBootStarterApplication.class, args);

}

}

创建测试AspectLog功能controller

package com.oysept.controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.RestController;

import com.oysept.autoconfiguration.aspectlog.AspectLog;

@RestController

public class GetController {

/**

* 访问地址: http://localhost:8080/test/starter/aspectlog?param=TTTEEESSSTTT

* @return

*/

@AspectLog

@RequestMapping(value="/test/starter/aspectlog", method = RequestMethod.GET)

public String testStarterAspectLog(@RequestParam(value = "param") String param) {

System.out.println("==>/test/starter/aspectlog, param: " + param);

// 处理业务逻辑

return "/test/starter/aspectlog SUCCESS!";

}

}

在想要打印日志的方法上,使用@AspectLog注解

启动TestSpringBootStarterApplication中的main方法

在浏览器中输入:http://localhost:8080/test/starter/aspectlog?param=TTTEEESSSTTT

然后在控制台查看效果:


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringBoot RestTemplate GET POST请求的实例讲解
下一篇:MyBatis JdbcType 与Oracle、MySql数据类型对应关系说明
相关文章

 发表评论

暂时没有评论,来抢沙发吧~