如何使用注释的值来初始化 bean
How use an annotation's value to initialize a bean
我有以下注释。
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Import(MyBeanInitializer.class)
public @interface MyAnnotation {
String clientType() default "" ;
}
我有一个如下所示的 Bean 初始化程序组件
@Configuration
public class MyBeanInitializer {
@Bean() // trigger this when annoattion's value == "A"
public CommonBean firstBean() {
return new BeanA;
}
@Bean() // trigger this when annoattion's value == "B"
public CommonBean firstBean() {
return new BeanB;
}
}
我的 BeanA 和 BeanB 的 Commoin 接口
public interface CommonBean {
void doSomething();
}
我的两个实现是
@Component()
public class BeanA implements CommonBean {
@Overrid
public void doSomething (){
// implementation here
}
}
@Component()
public class BeanB implements CommonBean {
@Overrid
public void doSomething (){
// implementation here
}
}
我需要将上面的内容用作另一个 Spring 引导项目的库。在那个项目中,我用 @MyAnnotation(clientType="web")
注释 Application.java
然后我将 BeanA 或 BeanB 注入 class在该项目中使用构造函数注入。
通过查看通过注释传递的值来初始化 bean 的机制是什么?
不要为此使用注释值。
注释值在编译时是硬编码的,不能动态更改。另外,它在面对 @Conditional
时看起来和感觉起来 难以置信地 尴尬,它已经存在并且与获得 动态 的能力相关联属性。
你想要做的是使用 @Conditional
的组合,它允许你在给定特定环境变量的情况下定义你想要做什么,或者使用 @ConditionalOnProperty
中的注释34=]Spring Boot 简单地提供根据特定 属性.
中特定值的存在来连接 bean 的能力
这是它的样子。假设您有名为 common.basicImpl
和 common.advancedImpl
.
的属性
@Component
@ConditionalOnProperty(prefix = "common", value = "basicImpl")
public class BeanA implements CommonBean {
@Override
public void doSomething (){
// implementation here
}
}
@Component
@ConditionalOnProperty(prefix = "common", value = "advancedImpl")
public class BeanB implements CommonBean {
@Override
public void doSomething (){
// implementation here
}
}
请注意,仅此一项无法解决 两个 属性都存在的情况,并且您不能执行多个 @ConditionalOnProperty
语句。添加 @ConditionalOnMissingBean
以确保您不会不小心同时连接它们,这将对您有所帮助。
我有以下注释。
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Import(MyBeanInitializer.class)
public @interface MyAnnotation {
String clientType() default "" ;
}
我有一个如下所示的 Bean 初始化程序组件
@Configuration
public class MyBeanInitializer {
@Bean() // trigger this when annoattion's value == "A"
public CommonBean firstBean() {
return new BeanA;
}
@Bean() // trigger this when annoattion's value == "B"
public CommonBean firstBean() {
return new BeanB;
}
}
我的 BeanA 和 BeanB 的 Commoin 接口
public interface CommonBean {
void doSomething();
}
我的两个实现是
@Component()
public class BeanA implements CommonBean {
@Overrid
public void doSomething (){
// implementation here
}
}
@Component()
public class BeanB implements CommonBean {
@Overrid
public void doSomething (){
// implementation here
}
}
我需要将上面的内容用作另一个 Spring 引导项目的库。在那个项目中,我用 @MyAnnotation(clientType="web")
注释 Application.java
然后我将 BeanA 或 BeanB 注入 class在该项目中使用构造函数注入。
通过查看通过注释传递的值来初始化 bean 的机制是什么?
不要为此使用注释值。
注释值在编译时是硬编码的,不能动态更改。另外,它在面对 @Conditional
时看起来和感觉起来 难以置信地 尴尬,它已经存在并且与获得 动态 的能力相关联属性。
你想要做的是使用 @Conditional
的组合,它允许你在给定特定环境变量的情况下定义你想要做什么,或者使用 @ConditionalOnProperty
中的注释34=]Spring Boot 简单地提供根据特定 属性.
这是它的样子。假设您有名为 common.basicImpl
和 common.advancedImpl
.
@Component
@ConditionalOnProperty(prefix = "common", value = "basicImpl")
public class BeanA implements CommonBean {
@Override
public void doSomething (){
// implementation here
}
}
@Component
@ConditionalOnProperty(prefix = "common", value = "advancedImpl")
public class BeanB implements CommonBean {
@Override
public void doSomething (){
// implementation here
}
}
请注意,仅此一项无法解决 两个 属性都存在的情况,并且您不能执行多个 @ConditionalOnProperty
语句。添加 @ConditionalOnMissingBean
以确保您不会不小心同时连接它们,这将对您有所帮助。