fix: Fix beans are not loaded as the expected order.

This commit is contained in:
Zihlu Wang
2023-08-28 14:23:55 +08:00
parent 1a59de777a
commit 63a44bae87
4 changed files with 47 additions and 3 deletions
@@ -25,11 +25,13 @@ import com.auth0.jwt.interfaces.DecodedJWT;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.DependsOn;
/** /**
* <p> * <p>
@@ -61,6 +63,8 @@ import org.springframework.context.annotation.Bean;
@EnableConfigurationProperties(value = {SimpleJwtProperties.class}) @EnableConfigurationProperties(value = {SimpleJwtProperties.class})
@ConditionalOnClass({DecodedJWT.class, AuthzeroTokenResolver.class}) @ConditionalOnClass({DecodedJWT.class, AuthzeroTokenResolver.class})
@ConditionalOnMissingBean({TokenResolver.class}) @ConditionalOnMissingBean({TokenResolver.class})
@ConditionalOnBean(value = {GuidCreator.class}, name = "jtiCreator")
@AutoConfigureAfter(value = GuidAutoConfiguration.class)
public class AuthzeroTokenResolverAutoConfiguration { public class AuthzeroTokenResolverAutoConfiguration {
/** /**
@@ -96,8 +100,8 @@ public class AuthzeroTokenResolverAutoConfiguration {
* @return the {@link TokenResolver} instance * @return the {@link TokenResolver} instance
*/ */
@Bean @Bean
@ConditionalOnBean(value = {GuidCreator.class}, name = "jtiCreator")
public TokenResolver<DecodedJWT> tokenResolver() { public TokenResolver<DecodedJWT> tokenResolver() {
log.debug("Creating bean TokenResolver<DecodedJWT>.");
return new AuthzeroTokenResolver( return new AuthzeroTokenResolver(
jtiCreator, jtiCreator,
simpleJwtProperties.algorithm(), simpleJwtProperties.algorithm(),
@@ -18,10 +18,13 @@
package cn.org.codecrafters.simplejwt.autoconfiguration; package cn.org.codecrafters.simplejwt.autoconfiguration;
import cn.org.codecrafters.guid.GuidCreator; import cn.org.codecrafters.guid.GuidCreator;
import cn.org.codecrafters.simplejwt.autoconfiguration.conditions.GuidCreatorCondition;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.SearchStrategy;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import java.util.UUID; import java.util.UUID;
@@ -32,11 +35,12 @@ import java.util.UUID;
*/ */
@Slf4j @Slf4j
@AutoConfiguration @AutoConfiguration
@ConditionalOnMissingBean(value = GuidCreator.class, name = "jtiCreator")
public class GuidAutoConfiguration { public class GuidAutoConfiguration {
@Bean @Bean
@Conditional(GuidCreatorCondition.class)
public GuidCreator<?> jtiCreator() { public GuidCreator<?> jtiCreator() {
log.debug("[GuidAutoConfiguration] --- Initializing default jtiCreator.");
return UUID::randomUUID; return UUID::randomUUID;
} }
@@ -27,6 +27,7 @@ import io.jsonwebtoken.Jws;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -63,6 +64,8 @@ import org.springframework.context.annotation.Bean;
@EnableConfigurationProperties(value = {SimpleJwtProperties.class}) @EnableConfigurationProperties(value = {SimpleJwtProperties.class})
@ConditionalOnClass({Jws.class, Claims.class, JjwtTokenResolver.class}) @ConditionalOnClass({Jws.class, Claims.class, JjwtTokenResolver.class})
@ConditionalOnMissingBean({TokenResolver.class}) @ConditionalOnMissingBean({TokenResolver.class})
@ConditionalOnBean(value = {GuidCreator.class}, name = "jtiCreator")
@AutoConfigureAfter(value = GuidAutoConfiguration.class)
public class JjwtTokenResolverAutoConfiguration { public class JjwtTokenResolverAutoConfiguration {
/** /**
@@ -98,7 +101,6 @@ public class JjwtTokenResolverAutoConfiguration {
* @return the {@link TokenResolver} instance * @return the {@link TokenResolver} instance
*/ */
@Bean @Bean
@ConditionalOnBean(value = {GuidCreator.class}, name = "jtiCreator")
public TokenResolver<Jws<Claims>> tokenResolver() { public TokenResolver<Jws<Claims>> tokenResolver() {
return new JjwtTokenResolver( return new JjwtTokenResolver(
jtiCreator, jtiCreator,
@@ -0,0 +1,34 @@
package cn.org.codecrafters.simplejwt.autoconfiguration.conditions;
import cn.org.codecrafters.guid.GuidCreator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
import java.util.Objects;
/**
* GuidCreatorCondition
* <p>
* Created on 28 Aug 2023
*
* @author Zihlu Wang
*/
@Slf4j
public class GuidCreatorCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
log.debug("[GuidCreatorCondition] --- Detecting bean jtiCreator.");
final var beanFactory = Objects.requireNonNull(context.getBeanFactory());
var isContainJtiCreator = beanFactory.containsBean("jtiCreator");
log.debug("[GuidCreatorCondition] --- Bean jtiCreator {} been created.", isContainJtiCreator ? "has" : "has not");
if (isContainJtiCreator) {
var result = !(beanFactory.getBean("jtiCreator") instanceof GuidCreator<?>);
log.debug("[GuidCreatorCondition] --- Create jtiCreator now? {}.", result ? "yes" : "no");
return result;
}
log.debug("[GuidCreatorCondition] --- Condition passed.");
return true;
}
}