JYM大家好,这里是布洛妮娅, 鸭鸭的工作笔记频道😎!!
枚举类注入Bean
一、背景
本人在疯狂敲代码的时候,大佬告诉我让我优化一下我的这个枚举类,把参数放到配置文件内,这样可以根据环境配置,方便又快捷!之前是这样的:
public enum AuthMySource implements AuthSource {
myEnum {
@Override
public String authorize() {
return "https://account.XXXX.com/sso/oauth2.0/authorize";
}
@Override
public String accessToken() {
return "https://account.XXXX.com/sso/oauth/accessToken";
}
@Override
public String userInfo() {
return "https://api-test.XXXX.com/services/vsa/v2/user/profile";
}
}
}
这样的写法确实更改里面地址的时候很麻烦,特别是部署到不同环境中.
二、优化
一优化我就百度,结果被某站给恶心到了,一个学习方法全网都在用!!离谱!算了自己写,经大佬点拨,枚举类是可以注入Bean来给枚举对象传值的.结合 @PostConstruct注解,这个注解的方法将会在依赖注入完成后被自动调用.通过一个 abstract方法就能将配置数据传给枚举.
public enum AuthMySource implements AuthSource {
myEnum {
private String authUrl;
private String accessTokenUrl;
private String userInfoUrl;
@Override
public void setBean(String authUrl,String accessTokenUrl,String userInfoUrl) {
this.authUrl = authUrl;
this.accessTokenUrl = accessTokenUrl;
this.userInfoUrl = userInfoUrl;
}
@Override
public String authorize() {
return authUrl;
}
@Override
public String accessToken() {
return accessTokenUrl;
}
@Override
public String userInfo() {
return userInfoUrl;
}
};
public abstract void setBean(String authUrl, String accessTokenUrl, String userInfoUrl);
@Component
@Data
static class EnumContainer {
@Value("${config.auth-url}")
private String authUrl;
@Value("${config.access-token-url}")
private String accessTokenUrl;
@Value("${config.user-info-url}")
private String userInfoUrl;
@PostConstruct
private void postConstruct(){
myEnum.setBean(authUrl,accessTokenUrl,userInfoUrl);
}
}
}
也可以这样写,喜欢用哪个就用哪个,我比较喜欢下面这个:
@Component
@ConfigurationProperties(prefix = "config")
@Data
static class EnumContainer {
private String authUrl;
private String accessTokenUrl;
private String userInfoUrl;
@PostConstruct
private void postConstruct(){
myEnum.setBean(authUrl,accessTokenUrl,userInfoUrl);
}
}
三、最后
稍微解释一下:我们通过 @Component注解将EnumContainer注入到容器中,而 @Value 会读取配置文件的内容,给属性赋值,这样我们就得到了一个有值的 Bean对象,在这个枚举类中我们定义了一个抽象方法 setBean() 并且枚举项内实现该方法,而 @PostConstruct注解的方法会将在依赖注入完成之后被自动调用,该方法内部调用了枚举项中实现的抽象方法 setBean(),这样也就完成了值的传递.
最后当然是成功了,摸鱼去,不对,学习,是学习!