AgE 2.4 : Postac klas opisujacych komponenty

Postać klas opisujących komponenty

Infrastruktura komponentowa platformy jAgE dostarcza dwa rodzaje wstrzykiwania zależności. Każdy z nich narzuca pewne wymagania na klasy, które reprezentują komponenty.

Pierwszym typem jest wstrzykiwanie z wykorzystaniem konstruktora. Działa ono podobnie do analogicznego wstrzykiwanie zaimplementowanego we frameworku PicoContainer. Do inicjalizacji komponentu wybierany jest publiczny konstruktor, którego lista parametrów odpowiada dokładnie typom argumentów zawartych w modelu konfiguracji. W taki sposób mogą być inicjalizowane komponenty reprezentowane przez dowolne obiekty POJO. Jedynym wymaganiem jest posiadanie odpowiedniego konstruktora. Przykładową klasę, która może być inicjalizowana w ten sposób przedstawia fragment kodu.

package org.jage.samples;

public class Movie {

    private String title;
    private Date year;
    private Actor[] actors;

    public Movie(String year,
                Date year, Actor[] actors) {
        this.title = title;
        this.year = year;
		this.actors = actors;
    }
}

Wstrzykiwanie z wykorzystaniem adnotowanych pól i metod wykorzystuje natomiast powstały wcześniej mechanizm właściwości obiektów. Klasy opisujące komponenty, które mają być inicjalizowane w ten sposób, muszą być tak zwanymi kontenerami właściwości (implementować interfejs IPropertyContainer). Ograniczenie to jednak nie wpływa znacząco na funkcjonalność mechanizmu, ponieważ w platformie AgE wszystkie agenty z założenia są takimi kontenerami. Wszystkie pola, które mogą być inicjalizowane za pomocą wstrzykiwania zależności, muszą być zdefiniowane jako właściwości obiektu.

Poniższy fragment kodu pokazuje najistotniejsze fragmenty klasy posiadającej trzy pola, które mogą być konfigurowane z wykorzystaniem kontenera IoC. Adnotacja @PropertyField występuje przed deklaracją konfigurowalnego pola. Określa jego nazwę, która wykorzystywana jest w modelu konfiguracji do powiązania pola z zależnością. Adnotacja @PropertySetter poprzedza metodę typu ,,set'', która służy do wstrzyknięcia zależności. Podobnie jak adnotacja @PropertyField, posiada atrybut propertyName, o takim samym znaczeniu.

package org.jage.samples;

public class Movie implements IPropertyContainer {

    @PropertyField(propertyName = "title")
    private String title;

    @PropertyField(propertyName = "year")
    private Date year;

    private Actor[] actors;

    @PropertySetter(propertyName = "actors")
    public void setAddress(Actor[] actors) {
        this.actors = actors;
    }

    // ...