Java EE’de Injection Mekanizması

Java EE, nesnelerin instance’larını yaratmadan direk erişilebilmesini sağlayan iki tip injection mekanizması destekler. Sadece gerekli olan kaynaklar ve bağımlı oldukları nesneler annotation‘lar ile belirtilir. Geri kalan tüm iş Container tarafından ele alınır. Bu yazımda kullanılan iki tip Injection ile ilgili bilgiler vermeye çalışacağım :

      1. Resource Injection :

Container tarafından yönetilen ve JNDI ile erişebildiğimiz nesnelere erişmek için kullanılır. Örneğin Servlet sınıfları, Managed Bean’ler, Enterprise Bean’ler ya da sunucuda tanımlanmış olan bağlantı havuzları gibi veri kaynakları.

@Resource annotation’ı kullanılır.

[codesyntax lang=”java5″ lines=”no”]

public class MyServlet extends HttpServlet {
	@Resource(name="java:comp/erkin")
	private Datasource dsc;
	...
}

[/codesyntax]

Benzer bir iş setter metodu tanımlayarak da kullanılabilir.

[codesyntax lang=”java5″ lines=”no”]

public class MyServlet extends HttpServlet {
	private Datasource dsc;
	...
	@Resource(name="java:comp/erkin")
	public void setDsc(Datasource ds) {
		dsc = ds;
	}
}

[/codesyntax]

[box type=”info”] Setter metotlarının mutlaka void dönüş tipi olması, metot isminin set ile başlaması ve tek bir parametre alması gerekir.[/box]

 @Resource annotation’ı type safe olmadığı için dönen nesnelerle atanan nesnelerin tipinin aynı olması gerekir. Aynı olmadığı takdirde çalışma anında hata alırsınız.

     2. Dependency Injection :

Dependency Injection sayesinde normal Java sınıfları, managed nesnelere dönüştürülerek Container tarafından yönetilen başka bir nesne içerisinde kullanılabilir.

@Inject annotation’ı kullanılır. Bu annotation ile belirtilen neesnelerin tüm yaşam döngüleri (yaratılmasından yok edilmesine kadar) Container tarafından yönetilir. Ayrıca Java EE Inject edilen bean’ler için geçerlilik bölgeleri tanımlar. (Scope)

[codesyntax lang=”java5″ lines=”no”]

@RequestScoped
public class CurrencyConverter { ... }

[/codesyntax]

Servlet sınıfı içindeki kod :

[codesyntax lang=”java5″ lines=”no”]

public class MyServlet extends HttpServlet {
    @Inject CurrencyConverter cc;
    ...
}

[/codesyntax]

Resource Injection’a kıyasla Dependency Injection’da nesneler type safe yönetilirler.

Aralarındaki genel farklar :

cdi

Kaynak : http://docs.oracle.com/javaee

Yorum bırakın