springboot注解动态赋值_⼿写SpringBoot⾃动配置及⾃定义注
解搭配Aop,。。。
背景
项⽬中为了统⼀管理项⽬的配置,⽐如接⼝地址,操作类别等信息,需要⼀个统⼀的配置管理中⼼,类似nacos。
我根据项⽬的需求写了⼀套分布式配置中⼼,测试⽆误后,改为单体应⽤并耦合到项⽬中。项⽬中使⽤配置⽂件多是取配置⽂件(l)的值,使⽤@Value获取,为了秉持⾮侵⼊性的原则,我决定写⼀套⾃定义注解,以实现最少的代码量实现业务需求。
思路
需要实现类似springboot @Value注解获取配置⽂件对应key的值的功能。但区别在于 我是从⾃⼰写的⾃动配置中获取,原理就是数据库中查询所有的配置信息,并放⼊⼀个对象applicationConfigContext,同时创建⼀个bean交给spring托管,同时写了个aop,为被注解的属性赋⼊applicationConfigContext的对应的值。
换句话说,⾃定义的这个注解为类赋值的时间线⼤概是
spring bean初始化 —-> 第三⽅插件初始化 --> 我写的⾃动配置初始化 ---- ⽤户调⽤某个⽅法,触发aop机制,我通过反射动态改变了触发aop的对象的bean的属性,将值赋值给他。
难点
本项⽬的难点在于如何修改对象的值。看似简单,其实⾥⾯的⽂章很多。
⾃动配置代码
配置映射数据库pojo
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
* @Describtion config bean
* @Author yonyong
* @Date 2020/7/13 15:43
* @Version 1.0.0
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder(toBuilder = true)
public class TblConfig {
private Integer id;
/
**
/**
* 默认配置值
*/
private String keyValue; /**
* 分类
*/
private String keyGroup; /**
* 备注
*/
private String description; /**
* 创建时间
*/
private Date insertTime; /**
* 更新时间
*/
springboot aopprivate Date updateTime; /**
* 创建⼈
*/
private String creator; private Integer start; private Integer rows;
/**
* 是否是系统⾃带
*/
private String type;
/**
}
创建⽤于防⽌配置信息的对象容器import lombok.AllArgsConstructor; import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor; import java.util.List;
import java.util.stream.Collectors; /**
* @Describtion config container
* @Author yonyong
* @Date 2020/7/13 15:40
* @Version 1.0.0
**/
@Data
@Builder(toBuilder = true)
@AllArgsConstructor
@NoArgsConstructor
public class ConfigContext {
/**
* config key-val map
*/
private List vals;
/
**
* env type
*/
private String group;
/**
* get config
* @param key
* @return
*/
public String getValue(String key){
final List collect = vals.stream()
.
filter(tblConfig -> KeyName().equals(key))
.List());
if (null == collect || collect.size() == 0)
return null;
(0).getKeyValue();
}
}
创建配置,查询出数据库⾥配置并创建⼀个容器bean
import org.apachemons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.fig.ConfigurableBeanFactory;
import org.springframework.dition.ConditionalOnClass;
import org.springframework.dition.ConditionalOnMissingBean; import t.annotation.Bean;
import t.annotation.Configuration;
import t.annotation.Scope;
import javax.annotation.Resource;
import java.util.List;
/**
* @Describtion manual auto inject bean
* @Author yonyong
* @Date 2020/7/13 15:55
* @Version 1.0.0
**/
@Configuration
@ConditionalOnClass(ConfigContext.class)
public class ConfigContextAutoConfig {
@Value("${up:DEFAULT_ENV}")
private String group;
@Resource
private TblConfigcenterMapper tblConfigcenterMapper;
@Bean(name = "applicationConfigContext")
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
@ConditionalOnMissingBean(ConfigContext.class)
public ConfigContext myConfigContext() {
ConfigContext configContext = ConfigContext.builder().build();
//set group
if (StringUtils.isNotBlank(group))
group = "DEFAULT_ENV";
//set vals
TblConfig tblConfig = TblConfig.builder().keyGroup(group).build();
final List tblConfigs = tblConfigcenterMapper.selectByExample(tblConfig); configContext = Builder()
.vals(tblConfigs)
.group(group)
.build();
return configContext;
}
}
AOP相关代码
创建⾃定义注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Author yonyong
* @Description //配置
* @Date 2020/7/17 11:20
* @Param
* @return
**/
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME)
public @interface MyConfig {
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论