Skip to content

3. Inversão de controle IoC

Vamos nos deter agora no conceito de inversão de controle (IoC, Inversion of Control) utilizado pelo Spring para configurar as aplicações. Para ilustrar esse conceito, voltemos à arquitetura da nossa aplicação de teste anterior:

Para acessar os dados do SGBD, a classe de teste deve utilizar os serviços de um objeto que implemente a interface [IArticlesDao], por exemplo, um objeto do tipo [ArticlesDaoPlainODBC]. Analisamos duas soluções possíveis para instanciar tal objeto:

  • na primeira solução, a própria classe de teste solicitava a instanciação de um objeto do tipo [ArticlesDaoPlainODBC]:
    <TestFixture()> _
    Public Class NunitTestArticlesDaoPlainOdbc

         ' o objeto a ser testado
        Private articlesDao As IArticlesDao

        <SetUp()> _
        Public Sub init()
             ' cria-se uma instância do objeto a ser testado
            articlesDao = New ArticlesDaoPlainODBC("odbc-firebird-articles", "SYSDBA", "masterkey")
        End Sub
...
    End Class

Existe uma dependência rígida no código em relação ao nome da classe. Se a classe de implementação da interface [IArticlesDao] vier a mudar, o código do método [init] precisará ser alterado. Existem as seguintes relações entre os objetos:

A própria classe [NunitTestArticlesDaoPlainOdbc] toma a iniciativa de criar o objeto [ArticlesDaoPlainODBC] de que necessita. Voltando ao termo “inversão de controle”, dir-se-á que é ela quem tem o “controle” para criar o objeto de que necessita.

  • A segunda solução procede de maneira diferente. A classe de teste ficou da seguinte forma:
    <TestFixture()> _
    Public Class NunitSpringTestArticlesDaoPlainOdbc

         ' o objeto a ser testado
        Private articlesDao As IArticlesDao

        <SetUp()> _
        Public Sub init()
       ' recupera-se uma instância do criador de objetos do Spring
            Dim factory As XmlObjectFactory = New XmlObjectFactory(New FileStream("spring-config-plainodbc.xml", FileMode.Open))
       ' solicita-se a instanciação do objeto DAO de artigos
            articlesDao = CType(factory.GetObject("articlesdao"), IArticlesDao)
        End Sub
    ...
    End Class

Esse mecanismo poderia ser esquematizado da seguinte forma:

Aqui, a classe de teste não toma a iniciativa de solicitar a criação de um objeto [ArticlesDaoPlainODBC]. Ela se limita a solicitar ao Spring uma referência a tal objeto. Se o objeto existir, o Spring retorna uma referência a ele. Se não existir, ele o cria. A classe de teste perdeu o controle sobre a criação do objeto [ArticlesDaoPlainODBC]. Ela simplesmente solicita uma referência a esse objeto. Essa solicitação, neste caso, forçará o Spring a criar o objeto. Mas seria possível imaginar, em outro contexto, que o objeto solicitado já tivesse sido criado a pedido da aplicação. Nesse caso, o Spring não recria o objeto, mas retorna uma referência ao objeto já existente (singleton). O conceito de Inversão de Controle (IoC) significa, neste contexto:

  • que a aplicação nunca toma a iniciativa de criar os singletons de que necessita. Ela simplesmente solicita referências a eles.
  • é o Spring que decide criar um singleton na primeira solicitação de referência a ele