枚举类注入Bean

1,196 阅读2分钟

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(),这样也就完成了值的传递.

最后当然是成功了,摸鱼去,不对,学习,是学习!