Inversão de Controle (IoC) e Injeção de Dependência (DI) são dois conceitos fundamentais no Spring Framework. Tradicionalmente, os objetos são responsáveis por criar e gerenciar suas próprias dependências. No entanto, a IoC inverte essa responsabilidade ao entregar o controle da criação de objetos e do gerenciamento de dependências para uma estrutura como o Spring.
Essa mudança oferece diversas vantagens:
IoC pode ser implementado por meio de vários mecanismos, incluindo padrões de design como Factory Pattern, Strategy Pattern ou Service Locator Pattern. No entanto, a maneira mais comum e poderosa de obter IoC é por meio da injeção de dependência.
Injeção de dependência (DI) é uma técnica em que a estrutura injeta dependências em um objeto, em vez de o próprio objeto criar as dependências. Existem diferentes tipos de DI no Spring:
Por exemplo, em uma classe de serviço simples, você pode ver algo assim:
@Service public class OrderService { private final PaymentService paymentService; @Autowired public OrderService(PaymentService paymentService) { this.paymentService = paymentService; } public void processOrder(Order order) { paymentService.processPayment(order.getPaymentDetails()); } }
Aqui, PaymentService é injetado em OrderService por meio de injeção de construtor, que geralmente é preferido por suas dependências claras e facilidade de teste.
Spring fornece um contêiner IoC responsável por gerenciar o ciclo de vida dos beans (objetos gerenciados pelo Spring). A interface básica para este contêiner é BeanFactory. No entanto, a maioria dos aplicativos usa ApplicationContext, que estende o BeanFactory e oferece recursos adicionais.
// Getting a bean from the ApplicationContext ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); MyBean myBean = context.getBean(MyBean.class);
Neste exemplo, ApplicationContext é usado para recuperar um bean. Se você estivesse usando um BeanFactory básico, ele ofereceria funcionalidade semelhante, mas sem os benefícios adicionais do ApplicationContext.
Existem duas maneiras comuns de acessar o ApplicationContext atual:
Autowired: injete o ApplicationContext diretamente em seu componente.
@Autowired private ApplicationContext applicationContext;
ApplicationContextAware: implemente a interface ApplicationContextAware, que permite recuperar o ApplicationContext conforme necessário.
public class MyBean implements ApplicationContextAware { private ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext context) throws BeansException { this.applicationContext = context; } }
Quando um aplicativo Spring é iniciado, uma série de etapas ocorre:
Processando variáveis e propriedades de ambiente: O objeto Environment é criado, incorporando configurações de application.properties ou application.yml.
Criando o ApplicationContext: O tipo ApplicationContext apropriado é determinado e instanciado. Por exemplo, um aplicativo Spring Boot pode usar AnnotationConfigServletWebServerApplicationContext para configurações baseadas em Java.
Carregando definições de bean: Spring carrega definições de bean de várias fontes, como classes anotadas, classes @Configuration ou arquivos XML. Cada definição de bean inclui informações sobre o tipo, escopo, dependências e retornos de chamada do ciclo de vida do bean.
Processing BeanFactoryPostProcessors: Esses processadores modificam as definições de bean antes que os beans reais sejam criados.
Resolução de Dependências e Criação de Beans: O ApplicationContext resolve dependências e cria os beans. Se um bean tiver dependências de outros beans, essas dependências serão criadas primeiro.
Spring oferece suporte a vários escopos de bean, que definem o ciclo de vida e a visibilidade de um bean dentro do contêiner:
@Bean @Scope("prototype") public MyPrototypeBean myPrototypeBean() { return new MyPrototypeBean(); }
Neste exemplo, uma nova instância MyPrototypeBean é criada cada vez que é solicitada do contêiner.
Considere um cenário em que um bean com escopo Singleton depende de um bean com escopo Prototype. Normalmente, o bean protótipo seria criado apenas uma vez durante a inicialização do singleton. Para garantir que uma nova instância do bean protótipo seja fornecida a cada vez, o Spring usa objetos proxy.
@Component @Scope(value = "singleton") public class SingletonBean { @Autowired @Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS) private PrototypeBean prototypeBean; public void showMessage() { System.out.println(prototypeBean.getMessage()); } }
Aqui, ScopedProxyMode.TARGET_CLASS garante que uma nova instância PrototypeBean seja retornada cada vez que getMessage() for chamado.
Spring Boot é uma extensão do Spring Framework que simplifica a configuração e o desenvolvimento de novos aplicativos Spring. Ele fornece:
A configuração automática é um recurso poderoso do Spring Boot que configura muitas coisas para você com base nas dependências do seu caminho de classe. Isso é controlado por anotações condicionais como:
Por exemplo, se você tiver Jackson em seu caminho de classe, o Spring Boot configurará automaticamente um ObjectMapper para serialização JSON:
@Configuration @ConditionalOnClass(ObjectMapper.class) public class JacksonAutoConfiguration { // Configuration details... }
Se o ObjectMapper estiver presente, esta configuração será aplicada automaticamente. Caso contrário, ele será ignorado.
Você pode registrar as configurações automáticas ativas durante a inicialização adicionando o seguinte ao seu application.properties:
logging.level.org.springframework.boot.autoconfigure=DEBUG
Isso gerará um relatório detalhado mostrando quais configurações foram aplicadas e quais não foram, ajudando você a solucionar problemas ou entender a configuração do aplicativo.
Inversão de controle e injeção de dependência são conceitos básicos que permitem a flexibilidade, modularidade e testabilidade que tornam o Spring tão poderoso. Ao compreender como funciona o contêiner IoC do Spring, como os beans são gerenciados e como o Spring Boot estende esses recursos, você pode desenvolver aplicativos robustos e de fácil manutenção com mais eficiência.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3