给定一个这样的接口和实现类。
interface MyBean{
suspend fun suspend isEnabled(name:String): Boolean
}
@Service("myBean")
@NoArg // I created an annotation and configured the noarg plugin
//to satisfy Spring EL's `noarg default constructor` requirements.
class MyMbean(val antoherBean: AnotherBean): MyBean{
override suspend fun isEnabled(name:String): Boolean{
}
}
像这样将其涂抹在
@ConditonalOnExpression
上时。
@Configuration
@ConditionalOnExpression("#myBean.isEnabled('test')")
class MyConfig{}
对于 EL 字符串,我尝试过
#{myBean.isEnabled('test')}
等,但没有成功。
EL1008E: Property or field 'myBean' cannot be found on object of type
'org.springframework.beans.factory.config.BeanExpressionContext'
- maybe not public or not valid?
我使用的是最新的 Spring Boot 3.3.1 和 Kotlin 2.0.0/Kotlin Coroutines 1.8.x。
更新:我尝试删除
suspend
修饰符,但仍然遇到失败。
我们通常使用
@Configuration
注释作为定义“核心”bean 的地方。
然后使用
@Component
(或@Service
,@Repository
)注释来定义使用“核心”bean 的“特定”bean。
这就是为什么
MyConfig
会在MyMbean
之前初始化。
如果你想尝试这样做。你必须自定义自己的条件并手动创建bean:
@Configuration
@Conditional(MyBeanCondition.class)
public class MyConfig {}
public class MyBeanCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
MyBean mybean = context.getBeanFactory().createBean(MyMbean.class);
return mybean.isEnabled("test");
}
}