spring-boot自动装配
springboot的出现就是为了简化spring开发,提供开箱即用的手脚架功能.基于springboot自动装配原理手撸一个starter
starter命名规范:
官方命名格式:spring-boot-starter-模块名
自定义命名规范:模块名-spring-boot-starter
需求:
目的:实现http返回数据的加密处理
实现:aop
单一功能可以直接使用aop,如果很多微服务都要类似的交互,不妨写一个通用的工具类.这里用starter方式来实现
步骤
- 创建项目:scrypt-spring-boot-starter
- 引入aop依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
-编写config
@ConfigurationProperties(prefix = "scrypt")
@Getter
@Setter
public class DescrptProperties {
private boolean enable=false;
private String scrypt;
}
- 交互类
public class JSONResponse {
private String message;
private long code;
private boolean success=true;
private Object result;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public long getCode() {
return code;
}
public void setCode(long code) {
if (code!=200){
this.setSuccess(false);
}
this.code = code;
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public Object getResult() {
return result;
}
public void setResult(Object result) {
this.result = result;
}
}
- 自定义注解
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Descrpt {
String value() default "";
boolean required() default false;
}
- 编写aop实现
@Configuration
@EnableConfigurationProperties(DescrptProperties.class)
@ConditionalOnProperty(
prefix = "scrypt",
name = "enable",
havingValue = "true"
)
@Aspect
public class DesAopConfig {
@Autowired
DescrptProperties descrptProperties;
/**
* 微服务交互响应参数加密
* @param joinPoint
* @param returnValue
*/
@AfterReturning(value = "@annotation(com.itmck.securityspringbootstarter.annotation.Descrpt)",returning = "returnValue")
public void handler(JoinPoint joinPoint,Object returnValue){
if (descrptProperties.isEnable()) {
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
Descrpt descrpt = methodSignature.getMethod().getAnnotation(Descrpt.class);
boolean required = descrpt.required();
if (required) {
String scrypt;
if(StringUtils.isEmpty(descrpt.value())){
scrypt = descrptProperties.getScrypt();
}else {
scrypt = descrpt.value();
}
JSONResponse resp = (JSONResponse) returnValue;
Object result = resp.getResult();
if (result instanceof String){
result+=scrypt;//这里省略加密逻辑
resp.setResult(result);
}
}
}
}
}
- 创建resources\META-INF\spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.itmck.securityspringbootstarter.config.DesAopConfig
- 打包
mvn clean install
其他项目中引入依赖
<dependency>
<groupId>com.itmck</groupId>
<artifactId>scrypt-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
- 使用
在自己的工程中application.yml中使用
scrypt:
enable: true
scrypt: '12345678'