Inversão de controle e Injeção de dependência

Boa noite. Alguém conseguiria me explicar o que são cada uma delas e a diferença entre as duas? E também: elas são características próprias do Spring ou se pode usar sem ter o Spring?
Grato.

São conceitos e um complementa o outro.

Inversão de Controle significa que, antes, o que o desenvolver fazia manualmente, passa a ser feito por outro mecanismo (ex.: um contexto). Essas coisas, podem ser, manter a instância dos objetos em seus devidos escopos, controlar transações, manter sessões, etc.

Injeção de Dependência se refere ao controle em cima das instâncias da aplicação que é mantida por um contexto. A injeção é um mecanismo de se obter essas instâncias controladas (ex.: @Autowired do spring e @Inject do JavaEE).

Obrigado, mas será que você conseguiria baixar um pouco mais o nível da explicação? hehehe
Brincadeiras a parte, mas é que eu recém saí de orientação a objetos, e me deparei com esses assuntos a pouco tempo…

Inversão de controle significa deixar o Spring responsável por, como no exemplo do Lucas, manter a instância dos objetos, controlar e manter sessões, transações, querys etc.

Injeção de dependência é deixar o Spring responsável por injetar os atributos necessários nas classes, sem que você tenha que ficar instanciando.

Quando um desenvolvedor cria um código, uma forma de usar outras classes (dependências) e recursos é assim:

public class SuaClasse {
	public void seuMetodo(String param) {
		try {
			BancoDados.iniciarTransacao();
			OutraClasse outraClasse = new OutraClasse();
			Resultado resultado = outraClasse.outroMetodo(param)
			// alguma lógica
			new MeuDao().salvar(resultado);
			BancoDados.commit();
		} catch(BancoDadosException ex) {
			BancoDados.rollback();
		}
	}
}

Nesse exemplo, temos uma lógica que fica em OutraClasse e também realizamos operações no banco usando MeuDao e ainda tratamos uma transação através da classe BancoDados com métodos estáticos.

Esse é um exemplo dos mecanismos serem criados e controlados pelo desenvolvedor. Note que não há inversão de controle, é o próprio desenvolvedor que realiza todo o controle manualmente. Se der algum erro e o desenvolvedor não tiver colocado o rollback no catch, o sistema não vai fazer o rollback apropriadamente. Se não fosse chamado o commit o sistema não iria salvar os dados no banco por conta própria.

Agora veja:

@Service
public class SuaClasse {
	
	@Autowired
	private OutraClasse outraClasse;
	
	@Autowired
	private MeuDao meuDao;
	
	@Transactional
	public void seuMetodo(String param) {
		Resultado resultado = outraClasse.outroMetodo(param)
		// alguma lógica
		meuDao.salvar(resultado);
	}
}

Esse exemplo utiliza mecanismos do contexto do Spring, que mantém o controle sobre as instâncias OutraClasse, MeuDao assim como a transação que é iniciado logo que o método é executado, o commit será realizado se não ocorrer nenhum erro, e em caso de erro, um rollback será realizado.

Com isso, em vez do desenvolvedor ficar criando instâncias desnecessariamente de coisas e correndo o risco de deixar recursos abertos, transações presas, além de deixar o código mais poluído. Toda a complexidade é absorvida por mecanismos criados para executar essas operações. Deixando o código apenas para a lógica negocial (depois dê uma lida sobre aspectos).

Esse é um exemplo do conceito de Inversão de Controle utilizando mecanismos de Injeção de Dependências do Spring.

1 curtida