IoC e DI
O Spring Container é o componente central do Spring Framework responsável pela criação, configuração e ciclo de vida dos beans (objetos) dentro de uma aplicação. O Spring Container também é conhecido como IoC container.
Uma dependência refere-se a qualquer classe que necessita que outros objetos sejam injetados para funcionar corretamente, e essa cadeia de dependências pode continuar indefinidamente. Normalmente, para criar um objeto com dependências, é necessário inicializá-lo explicitamente utilizando o operador new e especificar a classe.
É nesse ponto que o Spring atua com Inversion of Control e Dependency Injection. A ideia é que o Spring assume a responsabilidade de criar e gerenciar as dependências. Em vez de manualmente lidar com a configuração, basta anotar as classes necessárias, e o Spring as cria automaticamente e gerencia seu ciclo de vida dentro do seu contexto.
Uma dessas anotações é @Component, que deve ser colocada acima da classe.
BeanExample.java
123@Component public class BeanExample { }
Essa abordagem desloca o foco do gerenciamento manual de dependências, permitindo que desenvolvedores se concentrem na lógica de negócio enquanto o Spring lida com as tarefas de infraestrutura relacionadas à criação de objetos e ao gerenciamento de dependências.
Como funciona o contêiner Spring?
Quando a aplicação é iniciada, o Spring Container é inicializado. Ele começa escaneando as classes em busca de anotações como @Component, @Service, @Repository e @Configuration.
@Component é uma anotação geral que torna uma classe gerenciada pelo Spring, permitindo que ela seja registrada como um bean.
@Service, @Repository e @Controller são versões mais especializadas de @Component. Elas cumprem o mesmo propósito, mas indicam o papel específico da classe: @Service para lógica de negócio, @Repository para acesso a dados e @Controller para tratamento de requisições web.
@Configuration é utilizada para classes que contêm definições de beans e configuração da aplicação.
Ao marcar uma classe com uma dessas anotações, garante-se que ela se torne um bean dentro do contexto Spring.
Após a identificação das classes, o container procede à criação de instâncias dessas classes anotadas, transformando-as em beans que o contexto do Spring gerencia durante todo o ciclo de vida da aplicação.
À medida que esses beans são criados, o container gerencia automaticamente suas dependências por meio da Injeção de Dependências. Esse processo permite que as classes recebam as dependências necessárias sem a necessidade de criá-las ou localizá-las explicitamente, otimizando o processo de desenvolvimento.
Injeção de Dependências (DI)
Primeiramente, o Spring Container adiciona ao seu contexto os beans (classes) marcados com as anotações @Component, @Service, @Repository e @Configuration. Após isso, ele fornece esses beans para quaisquer objetos que os solicitarem.
Exemplo da Vida Real
Imagine o desenvolvimento de uma loja online. Existe uma classe OrderService que gerencia pedidos e uma classe PaymentService que processa pagamentos. Em vez de criar manualmente uma instância de PaymentService dentro de OrderService, é possível permitir que o Spring Container crie e injete PaymentService em OrderService.
OrderService.java
PaymentService.java
1234567891011121314@Service public class OrderService { private final PaymentService paymentService; public OrderService(PaymentService paymentService) { this.paymentService = paymentService; } public void placeOrder() { System.out.println("Placing order..."); paymentService.processPayment(); } }
Na classe OrderService, haverá um campo paymentService que é inicializado com o tipo exato necessário (PaymentService). Observe que não inicializamos explicitamente este objeto, o Spring fez isso por nós!
Se não tivéssemos anotado PaymentService com @Service, este bean não teria sido adicionado ao contexto do Spring, e ocorreria um erro indicando que o Spring não encontrou tal bean.
@Autowired
Também é possível utilizar a anotação @Autowired, que instrui o Container do Spring a injetar o objeto apropriado no campo.
OrderService.java
123456789101112131415@Service public class OrderService { private final PaymentService paymentService; @Autowired public OrderService(PaymentService paymentService) { this.paymentService = paymentService; } public void placeOrder() { System.out.println("Placing order..."); paymentService.processPayment(); } }
No Spring, a partir da versão 4.3, o uso da anotação @Autowired não é mais obrigatório ao injetar dependências por meio de um construtor se houver apenas um construtor na classe. O Spring determina automaticamente que esse construtor deve ser utilizado para a injeção de dependências.
Quais são os Diferentes Tipos de Bean?
Imagine que você tem uma única máquina de café em uma cafeteria. Sempre que um cliente pede um café, o barista utiliza essa mesma máquina de café para preparar cada xícara. A máquina de café é sempre a mesma, não uma nova para cada pedido.
Da mesma forma, no Spring, quando você injeta um bean do contexto Spring, o Spring fornece sempre a mesma instância desse bean. Isso é conhecido como o escopo singleton. Assim como a máquina de café na cafeteria, o Spring garante que você sempre receba o mesmo objeto em vez de criar um novo a cada vez.
Singleton
Podemos definir o tipo usando a anotação @Scope e especificar singleton nos atributos.
SingletonService.
12345@Service @Scope("singleton") public class SingletonService { // Class for handling business logic }
Protótipo
PrototypeService.java
12345@Service @Scope("prototype") public class PrototypeService { // Class for handling business logic }
Fazemos a mesma coisa, mas especificamos prototype nos atributos. Isso garante que cada vez que injetarmos esse bean, será retornado um novo objeto.
Resumo
Neste capítulo sobre IoC (Inversão de Controle) e DI (Injeção de Dependência), exploramos como o Spring gerencia a criação e o ciclo de vida dos beans por meio de seu container, possibilitando a injeção automática de dependências.
Discutimos o escopo padrão singleton, onde uma única instância de um bean é reutilizada, e o escopo prototype, que cria uma nova instância para cada requisição, destacando como esses escopos impactam o gerenciamento de objetos e o design da aplicação.
1. O que é Inversion of Control (IoC) no Spring?
2. Qual princípio fundamenta a Dependency Injection (DI)?
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Awesome!
Completion rate improved to 3.45
IoC e DI
Deslize para mostrar o menu
O Spring Container é o componente central do Spring Framework responsável pela criação, configuração e ciclo de vida dos beans (objetos) dentro de uma aplicação. O Spring Container também é conhecido como IoC container.
Uma dependência refere-se a qualquer classe que necessita que outros objetos sejam injetados para funcionar corretamente, e essa cadeia de dependências pode continuar indefinidamente. Normalmente, para criar um objeto com dependências, é necessário inicializá-lo explicitamente utilizando o operador new e especificar a classe.
É nesse ponto que o Spring atua com Inversion of Control e Dependency Injection. A ideia é que o Spring assume a responsabilidade de criar e gerenciar as dependências. Em vez de manualmente lidar com a configuração, basta anotar as classes necessárias, e o Spring as cria automaticamente e gerencia seu ciclo de vida dentro do seu contexto.
Uma dessas anotações é @Component, que deve ser colocada acima da classe.
BeanExample.java
123@Component public class BeanExample { }
Essa abordagem desloca o foco do gerenciamento manual de dependências, permitindo que desenvolvedores se concentrem na lógica de negócio enquanto o Spring lida com as tarefas de infraestrutura relacionadas à criação de objetos e ao gerenciamento de dependências.
Como funciona o contêiner Spring?
Quando a aplicação é iniciada, o Spring Container é inicializado. Ele começa escaneando as classes em busca de anotações como @Component, @Service, @Repository e @Configuration.
@Component é uma anotação geral que torna uma classe gerenciada pelo Spring, permitindo que ela seja registrada como um bean.
@Service, @Repository e @Controller são versões mais especializadas de @Component. Elas cumprem o mesmo propósito, mas indicam o papel específico da classe: @Service para lógica de negócio, @Repository para acesso a dados e @Controller para tratamento de requisições web.
@Configuration é utilizada para classes que contêm definições de beans e configuração da aplicação.
Ao marcar uma classe com uma dessas anotações, garante-se que ela se torne um bean dentro do contexto Spring.
Após a identificação das classes, o container procede à criação de instâncias dessas classes anotadas, transformando-as em beans que o contexto do Spring gerencia durante todo o ciclo de vida da aplicação.
À medida que esses beans são criados, o container gerencia automaticamente suas dependências por meio da Injeção de Dependências. Esse processo permite que as classes recebam as dependências necessárias sem a necessidade de criá-las ou localizá-las explicitamente, otimizando o processo de desenvolvimento.
Injeção de Dependências (DI)
Primeiramente, o Spring Container adiciona ao seu contexto os beans (classes) marcados com as anotações @Component, @Service, @Repository e @Configuration. Após isso, ele fornece esses beans para quaisquer objetos que os solicitarem.
Exemplo da Vida Real
Imagine o desenvolvimento de uma loja online. Existe uma classe OrderService que gerencia pedidos e uma classe PaymentService que processa pagamentos. Em vez de criar manualmente uma instância de PaymentService dentro de OrderService, é possível permitir que o Spring Container crie e injete PaymentService em OrderService.
OrderService.java
PaymentService.java
1234567891011121314@Service public class OrderService { private final PaymentService paymentService; public OrderService(PaymentService paymentService) { this.paymentService = paymentService; } public void placeOrder() { System.out.println("Placing order..."); paymentService.processPayment(); } }
Na classe OrderService, haverá um campo paymentService que é inicializado com o tipo exato necessário (PaymentService). Observe que não inicializamos explicitamente este objeto, o Spring fez isso por nós!
Se não tivéssemos anotado PaymentService com @Service, este bean não teria sido adicionado ao contexto do Spring, e ocorreria um erro indicando que o Spring não encontrou tal bean.
@Autowired
Também é possível utilizar a anotação @Autowired, que instrui o Container do Spring a injetar o objeto apropriado no campo.
OrderService.java
123456789101112131415@Service public class OrderService { private final PaymentService paymentService; @Autowired public OrderService(PaymentService paymentService) { this.paymentService = paymentService; } public void placeOrder() { System.out.println("Placing order..."); paymentService.processPayment(); } }
No Spring, a partir da versão 4.3, o uso da anotação @Autowired não é mais obrigatório ao injetar dependências por meio de um construtor se houver apenas um construtor na classe. O Spring determina automaticamente que esse construtor deve ser utilizado para a injeção de dependências.
Quais são os Diferentes Tipos de Bean?
Imagine que você tem uma única máquina de café em uma cafeteria. Sempre que um cliente pede um café, o barista utiliza essa mesma máquina de café para preparar cada xícara. A máquina de café é sempre a mesma, não uma nova para cada pedido.
Da mesma forma, no Spring, quando você injeta um bean do contexto Spring, o Spring fornece sempre a mesma instância desse bean. Isso é conhecido como o escopo singleton. Assim como a máquina de café na cafeteria, o Spring garante que você sempre receba o mesmo objeto em vez de criar um novo a cada vez.
Singleton
Podemos definir o tipo usando a anotação @Scope e especificar singleton nos atributos.
SingletonService.
12345@Service @Scope("singleton") public class SingletonService { // Class for handling business logic }
Protótipo
PrototypeService.java
12345@Service @Scope("prototype") public class PrototypeService { // Class for handling business logic }
Fazemos a mesma coisa, mas especificamos prototype nos atributos. Isso garante que cada vez que injetarmos esse bean, será retornado um novo objeto.
Resumo
Neste capítulo sobre IoC (Inversão de Controle) e DI (Injeção de Dependência), exploramos como o Spring gerencia a criação e o ciclo de vida dos beans por meio de seu container, possibilitando a injeção automática de dependências.
Discutimos o escopo padrão singleton, onde uma única instância de um bean é reutilizada, e o escopo prototype, que cria uma nova instância para cada requisição, destacando como esses escopos impactam o gerenciamento de objetos e o design da aplicação.
1. O que é Inversion of Control (IoC) no Spring?
2. Qual princípio fundamenta a Dependency Injection (DI)?
Obrigado pelo seu feedback!