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


