@Configuration
public class MyAppConfiguration extends MyBaseAppConfiguration {
@Bean
public MyDAOBean getMyDAOBean() {
boolean isEmpty = myString.isEmpty();
return new MyDAOBean();
}
}
@Component
@ConfigurationProperties(prefix="hey")
@Getter
@Setter
public class MyBean {
private String myString;
}
public class MyBaseAppConfiguration {
@Autowired
private MyBean myBean;
protected String myString;
//I need some annotation to call this (@PostConstruct maybe?)
public void setMyString() {
this.myString= myBean.getMyString();
}
}
我想用从myBean
得到的东西设置myString
。所以我需要一些注释来调用方法,我在myBean初始化之后但在调用getMyDAOBean
之前设置了这个字段。@PostConstruct
目前适用于这种情况,但我需要确定它是否始终有效。它能起作用吗?还是有一些我不知道的事情,这很危险?
请忽略示例的简单性。getMyDAOBean
中的myBean.getMyString()
会更容易,但它在现实中更复杂,只需关注问题即可。
编辑:setter注入方式怎么样?这有什么不同吗?更安全还是其他?
public class MyBaseAppConfiguration {
protected String myString;
@Autowired
public void setMyString(MyBean myBean) {
this.myString= myBean.getMyString();
}
}
您可以添加MyBean作为构造函数注入。
public class MyBaseAppConfiguration {
protected String myString;
@Autowired
public MyBaseAppConfiguration(MyBean myBean ){
myString = myBean.getMyString();
}
}
为MyDAOBean
创建bean似乎在某种程度上依赖于基于MyBean
属性的计算值。
@Conditional
注释和自定义条件可以用于执行所需的操作;CCD_ 10就是这种情况。
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
import java.util.Objects;
public class MyStringIsEmpty implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
// Get the spring bean for MyBean
MyBean myBean = Objects.requireNonNull(context.getBeanFactory()).getBean(MyBean.class);
// Get the property of myString
String myString = myBean.getMyString();
// perform your desired evaluation
boolean isEmpty = myString.isEmpty();
return isEmpty; // if true, the bean will be created
}
}
使用自定义条件。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
@Bean
@Conditional(MyStringIsEmpty.class)
public MyDAOBean getMyDAOBean() {
return new MyDAOBean();
}