Injeção de Dependência e Spring

Quem nunca ouviu falar em injeção de dependência? Ou inversão de controle? Pois bem, Inversão de Controle (IoC – Inversion of control) é uma estrategia para inverter quem está no comando de realizar determinadas operações. Quando se fala em inversão de controle, geralmente também se fala no princípio de Hollywood, que prega o seguinte “Don’t call us, we’ll call you” que signfica que a responsabilidade de chamar (ou instanciar/inicializar) alguma coisa não é (mais) sua, e sim de outro alguém.

Não precisa nem falar mas existem diversos tipos de inversão de controle, mas vamos no ater a um tipo específico que é bem conhecido, a Injeção de Dependência. A responsabilidade de instanciar/inicializar uma determinada dependência, não mais pertence a classe que a usa, mas sim a esse outro alguém que comentamos acima (no caso do java pode ser o Spring, e no casos de linguagens mais novas como ruby já existe um controle nativo de injeção).

Spring possui um container de inversão de controle, que tem um Application Context, que é uma espécie de repositório aonde o spring inicializa e guarda cada entidade que você sinalizar que o spring deve controlar (chamados de components ou beans). Uma vez explicitado quais entidades o spring deve controlar, ele já consegue gerenciar e injetar essas dependências em todas as outras entidades que as utilizam (e você explicitou)

Para iniciar, um grande facilitador do Spring são as injeções de dependência via Annotations. Tanto para você configurar quais classes vão ser controladas pelo spring ( @Component ), quanto para você configurar aonde o spring deve injetar as dependências ( @Autowired ). Antes dessas annotations, cada component e cada injeção tinham que ser configuradasem em um arquivo chamado (applicationcontext.xml), só que com essas anotações, basta colocar uma configuração no applicationContext.xml configurando o spring para scanear os pacotes do projeto procurando pelas classes anotadas com essas annotations que comentei anteriormente.

<context:annotation-config/>
<context:component-scan base-package="com.bytesdontbyte"/>
Aqui segue um exemplo de uma classe que estará dentro do applicationContext, pois está anotada com a annotation @Component.
@Component
public class MovieFinder {
    private MovieFinder movieFinder;
    private Movie findMovie(String name) { ... }
}

Neste próximo trecho fictício de código abaixo, o componente declarado acima (MovieFinder) é usado sem ser inicializado, mas como o atributo está anotado com @Autowired,
então o próprio spring injetar a uma instância dessa entidade na classe.

@Component
public class MovieOperations {
    @Autowired
    private MovieFinder movieFinder;

    private boolean isMovieAvailable(){
      boolean result = false;
      if  (this.movieFinder.findMovie("lord of the rings") != null)
          result = true;
      return result;
   {
}

Espero que tenha sido proveitoso para aqueles que estão iniciando neste mundo de injeção de dependências/inversão de controle e etc 😉