Java 应用程序上下文中某些bean的依赖关系形成一个循环:在spring引导中

Java 应用程序上下文中某些bean的依赖关系形成一个循环:在spring引导中,java,spring-boot,dependency-injection,inversion-of-control,Java,Spring Boot,Dependency Injection,Inversion Of Control,应用程序上下文中某些bean的依赖关系形成一个循环: ┌─────┐ | encode defined in class path resource [com/extenso/bi/backend/crm/config/BaseConversion.class] ↑ ↓ | decode defined in class path resource [com/extenso/bi/backend/crm/config/BaseConversion.class] └─────┘ 在这

应用程序上下文中某些bean的依赖关系形成一个循环:

┌─────┐
|  encode defined in class path resource [com/extenso/bi/backend/crm/config/BaseConversion.class]
↑     ↓
|  decode defined in class path resource [com/extenso/bi/backend/crm/config/BaseConversion.class]
└─────┘

在这种情况下,可以使用util类。关于什么是util类,这里有一个很好的解释。对于bean,您可以从这里的文档中检查什么是springbean以及它们是如何配置的

您似乎没有理解依赖注入的目的。将
字符串
布尔值
这样的简单数据值声明为bean几乎毫无意义;事实上,这些看起来只是纯函数,应该是
静态的


    @Configuration
    public class BaseConversion {
        private static final String allowedString "bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ0123456789";
        private final char[] allowedCharacters = allowedString.toCharArray();
        private final int base = allowedCharacters.length;
        
    
        @Bean
        @Primary
        @Qualifier("encode")
        public String encode( long id) {
            var encodedString = new StringBuilder();
            if (id == 0) {
                return String.valueOf(allowedCharacters[0]);
            }
            while (id > 0) {
                encodedString.append(allowedCharacters[(int) (id % base)]);
                id = id / base;
            }
            return encodedString.reverse().toString();
        }
    
        @Bean
        @Qualifier("getCheckSum")
        public String getCheckSum(long num) {
            int checksumNum = (int) ((num + 5) % (base * base));
            String checksum = encode(checksumNum);
            if (checksum.length() == 1) {
                checksum = encode((checksumNum + 5) % base) + checksum;
            }
            return checksum;
        }
    
        @Bean
        @Qualifier("checkShortUrl")
        public boolean isShortUrlValid( String shortUrl) {
            String checkSum = shortUrl.substring(0, 2);
            long decodedBaseUrl = decode(shortUrl.substring(2));
            return (checkSum.equals(getCheckSum(decodedBaseUrl)));
        }
    
    
        @Bean
        @Qualifier("decode")
        public long decode( String baseInput) {
            var characters = baseInput.toCharArray();
            var length = characters.length;
            var decoded = 0;
            var counter = 1;
            for (char character : characters) {
                decoded += allowedString.indexOf(character) * Math.pow(base, length - counter);
                counter++;
            }
            return decoded;
        }
    }