您可以使用以下接口之一創(chuàng)建 bean 鉤子:
- BeanInitializedEventListener - 允許在設(shè)置屬性之后但在 @PostConstruct 事件掛鉤之前修改或替換 bean。
- BeanCreatedEventListener - 允許在 bean 完全初始化并調(diào)用所有 @PostConstruct 掛鉤后修改或替換 bean。
BeanInitializedEventListener 接口通常與工廠 bean 結(jié)合使用。考慮以下示例:
Java |
Groovy |
Kotlin |
public class V8Engine implements Engine {
private final int cylinders = 8;
private double rodLength; // (1)
public V8Engine(double rodLength) {
this.rodLength = rodLength;
}
@Override
public String start() {
return "Starting V" + getCylinders() + " [rodLength=" + getRodLength() + ']';
}
@Override
public final int getCylinders() {
return cylinders;
}
public double getRodLength() {
return rodLength;
}
public void setRodLength(double rodLength) {
this.rodLength = rodLength;
}
}
@Factory
public class EngineFactory {
private V8Engine engine;
private double rodLength = 5.7;
@PostConstruct
public void initialize() {
engine = new V8Engine(rodLength); // (2)
}
@Singleton
public Engine v8Engine() {
return engine;// (3)
}
public void setRodLength(double rodLength) {
this.rodLength = rodLength;
}
}
@Singleton
public class EngineInitializer implements BeanInitializedEventListener<EngineFactory> { // (4)
@Override
public EngineFactory onInitialized(BeanInitializingEvent<EngineFactory> event) {
EngineFactory engineFactory = event.getBean();
engineFactory.setRodLength(6.6);// (5)
return engineFactory;
}
}
|
class V8Engine implements Engine {
final int cylinders = 8
double rodLength // (1)
@Override
String start() {
return "Starting V$cylinders [rodLength=$rodLength]"
}
}
@Factory
class EngineFactory {
private V8Engine engine
double rodLength = 5.7
@PostConstruct
void initialize() {
engine = new V8Engine(rodLength: rodLength) // (2)
}
@Singleton
Engine v8Engine() {
return engine // (3)
}
}
@Singleton
class EngineInitializer implements BeanInitializedEventListener<EngineFactory> { // (4)
@Override
EngineFactory onInitialized(BeanInitializingEvent<EngineFactory> event) {
EngineFactory engineFactory = event.bean
engineFactory.rodLength = 6.6 // (5)
return engineFactory
}
}
|
class V8Engine(var rodLength: Double) : Engine { // (1)
override val cylinders = 8
override fun start(): String {
return "Starting V$cylinders [rodLength=$rodLength]"
}
}
@Factory
class EngineFactory {
private var engine: V8Engine? = null
private var rodLength = 5.7
@PostConstruct
fun initialize() {
engine = V8Engine(rodLength) // (2)
}
@Singleton
fun v8Engine(): Engine? {
return engine// (3)
}
fun setRodLength(rodLength: Double) {
this.rodLength = rodLength
}
}
@Singleton
class EngineInitializer : BeanInitializedEventListener<EngineFactory> { // (4)
override fun onInitialized(event: BeanInitializingEvent<EngineFactory>): EngineFactory {
val engineFactory = event.bean
engineFactory.setRodLength(6.6) // (5)
return engineFactory
}
}
|
V8Engine 類定義了一個 rodLength 屬性
EngineFactory 初始化 rodLength 的值并創(chuàng)建實例
創(chuàng)建的實例作為 Bean 返回
實現(xiàn)BeanInitializedEventListener接口監(jiān)聽工廠的初始化
在 onInitialized 方法中,rodLength 在工廠 bean 創(chuàng)建引擎之前被覆蓋。
BeanCreatedEventListener 接口通常用于修飾或增強(qiáng)完全初始化的 bean,例如通過創(chuàng)建代理。
Bean 事件偵聽器在類型轉(zhuǎn)換器之前初始化。如果您的事件偵聽器通過配置屬性 bean 或任何其他機(jī)制依賴類型轉(zhuǎn)換,您可能會看到與類型轉(zhuǎn)換相關(guān)的錯誤。
更多建議: