Injeção de Dependência do Construtor na Primavera

Injeção de Dependência do Construtor na Primavera

1. Introdução

Indiscutivelmente, um dos princípios de desenvolvimento mais importantes do design de software moderno éDependency Injection (DI), que naturalmente flui de outro princípio criticamente importante:Modularity.

Este artigo explorará um tipo específico de técnica de DI chamadaConstructor-Based Dependency Injection no Spring - que, simplesmente, significa que os componentes necessários são passados ​​para uma classe no momento da instanciação.

Para começar, precisamos importar a dependênciaspring-context em nossopom.xml:


    org.springframework
    spring-context
    5.1.4.RELEASE

Em seguida, precisamos configurar um arquivoConfiguration. Este arquivo pode ser um POJO ou, se preferir, um arquivo XML.

Leitura adicional:

Introdução à Inversão do Controle e Injeção de Dependência com Mola

Uma rápida introdução aos conceitos de Inversão de Controle e Injeção de Dependência, seguida de uma demonstração simples usando o Spring Framework

Read more

Principais perguntas da entrevista do Spring Framework

Uma rápida discussão de perguntas comuns sobre o Spring Framework que podem surgir durante uma entrevista de emprego.

Read more

Fiação na primavera: @Autowired, @Resource e @Inject

Este artigo irá comparar e contrastar o uso de anotações relacionadas à injeção de dependência, a saber, as anotações @Resource, @Inject e @Autowired.

Read more

2. Configuração baseada em anotação

O arquivo de configuração Java se parece muito com um objeto Java simples, com algumas anotações adicionais:

@Configuration
@ComponentScan("com.example.constructordi")
public class Config {

    @Bean
    public Engine engine() {
        return new Engine("v8", 5);
    }

    @Bean
    public Transmission transmission() {
        return new Transmission("sliding");
    }
}

Aqui, estamos usando anotações para notificar o tempo de execução do Spring que esta classe é um provedor de definições de bean (anotação@Bean) e que uma varredura de contexto para beans adicionais precisa ser executada no pacotecom.example.spring. A seguir, definimos uma classeCar:

@Component
public class Car {

    @Autowired
    public Car(Engine engine, Transmission transmission) {
        this.engine = engine;
        this.transmission = transmission;
    }
}

O Spring encontrará nossa classeCar ao fazer uma varredura de pacote e inicializará sua instância chamando o construtor anotado@Autowired.

Instâncias deEngine and Transmission serão obtidas chamando métodos anotados de@Bean da classeConfig. Finalmente, precisamos inicializar umApplicationContext usando nossa configuração POJO:

ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
Car car = context.getBean(Car.class);

3. Injeção implícita de construtor

A partir do Spring 4.3, classes com um único construtor podem omitir a anotação@Autowired. Um pouco de conveniência e remoção de clichê!

Além disso, também começando com 4.3, a injeção baseada em construtor pode ser alavancada em classes anotadas@Configuration. E sim, se essa classe tiver apenas um construtor, a anotação@Autowired também pode ser omitida.

4. Configuração baseada em XML

Outra maneira de configurar o tempo de execução do Spring com injeção de dependência baseada em construtor é usar um arquivo de configuração xml:


    
    



    
    



    

Observe queconstructor-arg pode aceitar um valor literal ou uma referência a outro bean e queindexetype explícitos opcionais podem ser fornecidos. Os atributosTypeeindex podem ser usados ​​para resolver ambigüidade (por exemplo, se um construtor aceita vários argumentos do mesmo tipo).

O atributoname também pode ser usado para correspondência de variável xml para java, mas seu códigomust deve ser compilado com o sinalizador de depuração ativado.

Um contexto de aplicativo Spring, neste caso, precisa ser inicializado usandoClassPathXmlApplicationContext:

ApplicationContext context = new ClassPathXmlApplicationContext("example.xml");
Car car = context.getBean(Car.class);

5. Conclusão

Este tutorial rápido apresentou os fundamentos de duas maneiras distintas de usarConstructor-Based Dependency Injection usando o framework Spring.

Ofull implementation deste tutorial pode ser encontradoover on Github.