Mentawai Web Framework

Injeção de Dependência

Ao invés de criar dependências fortes em suas classes, instanciando uma classe dentro da outra, você pode e deve usar o pattern DI (Dependency Injection ou Injeção de Dependência) para injetar as dependências de uma classe automaticamente. Em qualquer aplicação, uma classe geralmente depende de outras para realizar suas tarefas. Um exemplo clássico é um DAO (Data Access Object) que depende/precisa de uma java.sql.Connection para acessar o banco-de-dados e carregar os dados de um objeto.

O Mentawai oferece um poderoso e totalmente automático e transparente suporte a DI através do filtro global org.mentawai.filter.DIFilter. Para o caso descrito acima, onde desejamos injetar uma Connection nas classes que precisam dela, tudo que precisamos fazer no ApplicationManager é:

					
	filter(new DIFilter()); // filter global and unique for all dependencies!
	
	di("connection", Connection.class);
					

Toda vez que um objeto for requisitado do input da action, o DIFilter vai checar se ele possui uma dependência do tipo Connection.class e com o nome "connection". Se ele possuir essa dependência, ou seja, se ele possuir uma propriedade com o nome "connection" e do tipo Connection.class, o DIFilter tentará obter do input da action um objeto através da chave "connection" (input.getValue("connection")) e, caso ele exista e também seja uma instancia de Connection.class, acontecerá uma injeção automática, ou seja, o objeto será inserido dentro do outro via reflection (auto-wiring).

Também é possível expecificar o nome da instância que será obtida do input da action e que deverá ser injetada no objeto que possui a dependência. No exemplo a cima, o DIFilter irá utilizar o mesmo nome "connection" tanto para a propriedade do objeto que precisa receber a dependência quanto para a dependência que deverá ser obtida do input da action. Mas se quisermos diferenciar a origem (source) do destino (target), então tudo que temos que fazer é utilizar o método source, conforme exemplificado abaixo:

			
	filter(new DIFilter()); // filter global and unique for all dependencies!
					
	di("connection", Connection.class).source("conn");
	
	// or
	
	di("connection", Connection.class, "conn");
										

O código acima procura por uma propriedade com o nome "connnection" do tipo Connection.class e procura no input da action um objeto com a chave "conn" para injetar. A injeção será efetuada via um método setter (Ex: setConnection()) ou diretamente no campo público ou privado (Ex: Connection connection).

A combinação do org.mentawai.filter.IoCFilter com o org.mentawai.filter.DIFilter transformam o Mentawai num poderoso e automático container de IoC que resolverá de forma eficiente e transparente a grande maioria das dependências do seu projeto.

A aplicação MyBooks Demo é um bom exemplo de como usar a injeção de dependências com DAOs.