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.