在bean初始化之后但在@bean调用之前调用方法


@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();
}

相关内容

  • 没有找到相关文章

最新更新