Café & Tapioca

Spring: IoC, DI & Beans

IoC

“Inversion of Control” ou “IoC” é um princípio dentro da engenharia de software que visa estabelecer um menor acoplamento, esse baixo acoplamento diz respeito a um código mais abstrato e genérico que cobre a maioria dos casos de uso, mas que ainda assim dá liberdade ao programador para extender essas funcionalidades dentro dos seus casos de uso específicos.

As vantagens desse tipo de arquitetura são:

DI

“Dependency Injection” ou “DI” é uma das formas de se aplicar o princípio de IoC, dentro desse padrão jogamos a responsabilidade de injetar as dependências para o programador, e não para a interface desse código.

// caso não apliquemos o padrão de DI dentro de uma classe,
// estamos colocando a instanciação dessa classe dentro de
// sua própria definição, aumentando muito o acoplamento
// pois o atributo está "hard-coded" dentro da classe.

public class Person() {
    private Age age;

    public Person() {
        this.age = new AgeImpl();
    }
}
// aqui estamos aplicando o conceito de DI,
// estamos definindo o que queremos, sem dizer como
// assim diminuimos o acoplamento e aumentamos a 
// abstração do código escrito, facilitando os testes, por exemplo

public class Person() {
    private Age age
    public Person(Age age) {
        this.age = age
    }
}

Beans

Um “Bean” é um objeto que o Spring instancia, monta e cuida. A documentação oficial do Spring recomenda usar a anotação de @Bean apenas para códigos relacionados com a camada de services, DAO’s ou infraestrutura.

// exemplo de classe

public class AccountConfig() {
    @Autowired
    private AccountRepository accountRepository;
}
// ao usar a configuração de beans

@Configuration
public class AccountConfig() {

    @Bean
    public AccountService accountService() {
        return new AccountService(accountRepository());
    }

    @Bean 
    public AccountRepository accountRepository() {
        return new AccountRepository();
    }
}

Os Beans também são uma forma de customizar dependências que não necessariamente fazem parte do ecossistema do Spring, porém precisam ser injetadas na aplicação, então a responsabilidade de dizer como o Spring vai realizar o controle do life-cycle desse objeto cabe a configuração do bean.

Os Beans fazem com que as dependências com essas anotações sejam incluídas na interface ApplicationContext (que é responsável por realizar o IoC dentro do Spring, juntamente com a interface BeanFactory).

#Acadêmico #Spring #Java