Wstrzykiwanie zależności

0

Przeszukałem całe internety i nie znalazłem prostych przykładów jak automatycznie wstrzykiwać zależności w Javie (nie w żadnym .Net, JavaScipcie czy Springu (bo to znalazłem) tylko czystej Javie).
Wiem, że można to robić ręcznie new MyClass(new DependencyClass()) ale to żadna korzyść żeby potem przy każdym tworzeniu klasy dopisywać jej wszystkie zależności w argumentach konstruktora. Jak to zdefiniować automatycznie?

No bo czytam o jakimś Springu i nie wiem co ja czytam

A bean can have multiple initializer methods. If the bean is a session bean, the initializer method is not required to be a business method of the session bean.

Możecie polecić jakieś proste artykuły czy przykłady dla początkujących?

0

cała zaleta DI to właśnie nie pisanie kodu :
new MyClass(new DependencyClass())

Wstrzykiwanie może działać w przypadku konstruktorów, za pomocą setterów lub poprzez refleksję za pomocą adnotacji (wtedy nie trzeba ani konstruktorów ani setterów):

MyService{
  @Autowire
  private MyOtherService myOtherService;
}

Jak zrobić w czystej javie to zależy co rozumiesz przez javę - czy main napisany w eclipsie czy full JEE serwer.

DI polega na tym, że jest sobie jakiś kontener, który zarządza twoją aplikacją i zarządza beanami (np spring) i dokonuje inicjalizacji/wstrzykiwania innych beanów do beanów które sobie deklarujesz. Stąd inversion of control.

Jak chcesz sobie w springu poćwiczyć to musisz podnieść kontext springa. Jak chcesz coś małego to może google guice będzie szybsze.

0

Chodzi mi o Javę w Eclipse.

Popatrz, weźmy przykładowo mam: klasę kontener ContenerClass , klasę zależną (Singleton) DependentClass i TestMain żeby uruchomić.


public class KontejnerClass {

	private int y;

	KontejnerClass(DependentClass dc) {
		this.y = dc.getX();
	}

	public void printY() {
		System.out.println(y);
	}
}

public enum DependentClass {

	INITIALIZE;

	private static final int x = 5;

	private DependentClass() {

	}

	public int getX() {
		return x;
	}
}

public class TestMain {

	public static void main(String[] args) {
		KontejnerClass cc = new KontejnerClass(DependentClass.INITIALIZE);

		cc.printY();
	}

}

i jak to wstrzyknąć mądrze by nie trzeba było przy tworzeniu ContenerClass przekazywać singletona?

1

Nie da się. Albo wstrzykujesz ręcznie, robiąc new Class(new Dependency(new AnotherDependency)) albo bierzesz framework który to automatyzuje.

0

@caer: dziękuję Ci, normalnie rozwiązałeś mój problem milenijny :)

1

DI w czystej Javie masz przez konstruktor z argumentami a tak kontener to frameworki :P Spring, Guice itp

0

@scibi92: dokładnie. DI to tylko wzorzec. IoC w tym wypadku pomaga po prostu zautomatyzować wstrzyknięcie właściwego obiektu. Wiele osób, zwłaszcza początkujących, używa DI po prostu bez kontenera i nawet nie wie, że to się tak nazywa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1