Micronaut Bean Events

2023-02-27 17:30 更新

您可以使用以下接口之一創(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
    }
}
  1. V8Engine 類定義了一個 rodLength 屬性

  2. EngineFactory 初始化 rodLength 的值并創(chuàng)建實例

  3. 創(chuàng)建的實例作為 Bean 返回

  4. 實現(xiàn)BeanInitializedEventListener接口監(jiān)聽工廠的初始化

  5. 在 onInitialized 方法中,rodLength 在工廠 bean 創(chuàng)建引擎之前被覆蓋。

BeanCreatedEventListener 接口通常用于修飾或增強(qiáng)完全初始化的 bean,例如通過創(chuàng)建代理。

Bean 事件偵聽器在類型轉(zhuǎn)換器之前初始化。如果您的事件偵聽器通過配置屬性 bean 或任何其他機(jī)制依賴類型轉(zhuǎn)換,您可能會看到與類型轉(zhuǎn)換相關(guān)的錯誤。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號