Magia detrás @ComponentScan y @Component

Zak Zak:

Todavía estoy aprendiendo inyección de dependencias primavera en profundidad.

Mi primera clase es una clase de configuración, donde i declaro al recipiente para carga y gestionar los granos declarados en los métodos comentados.

package ioc.question_004;

import ioc.commun.Person;
import ioc.commun.Profession;
import org.springframework.context.annotation.*;

@Configuration
public class MyConfiguration {

    @Bean
    public Profession profession(){
        return Profession.builder()
                     .name("professor")
                     .description("professor in the university")
                     .build();
    }

    @Bean
    public Person person(){
        return Person.builder()
                     .name("Bagna")
                     .age(52)
                     .profession(profession())
                     .build();
    }

}

La segunda clase es un daoRepository, se ve gustos:

package ioc.question_008.dao;

import ioc.commun.Person;
import lombok.*;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.List;

@Repository
@Builder
@Setter
@Getter
@EqualsAndHashCode
@ToString
public class MyDaoRepository implements dao {

    List<Person> personList = new ArrayList<>();

    @Override
    public boolean save( Person person ){
        return this.personList.add(person);
    }

    @Override
    public boolean delete( Person person ){
        return  this.personList.remove(person);
    }

}

Mi código que se ejecuta es el siguiente:

@Configuration
@Import(MyConfiguration.class)
@ComponentScan(basePackageClasses = {MyDaoRepository.class} )
public class DependencyInjection {
    public static void main( String[] args ) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DependencyInjection.class);
        dao myDaoRepository = (MyDaoRepository) context.getBean("myDaoRepository");
        System.out.println(myDaoRepository);
    }

}

Mágicamente MyDaoRepository contiene la persona @Bean declarado en la MyConfiguration clase de configuración:

MyDaoRepository (personList = [Persona (name = Bagna, edad = 52, profesión = Profesión (nombre = profesor, description = profesor en la universidad))])

Me thnik que el contenedor inyecta este objeto automáticamente aunque no me pregunte por ello. Puede haber alguna anotación @Autowired se añade por el compilador. No estoy seguro.

¿Podría por favor explicarme cómo puedo pedir al contenedor de primavera para no inyectar los granos, incluso si existe en el contenedor (la persona frijol por ejemplo), a menos que le pido al hacer la inyección por mí mismo con la anotación @Autowired.

sfiss:

La razón es la combinación de autowiring de primavera de las colecciones y de Lombok Builder

En primer lugar, la @Builderañade un constructor de todos los argumentos MyDaoRepository(List<Person> list).

En segundo lugar, la primavera detecta automáticamente sus métodos de fábrica @Bean public Person person().

Ahora, dado que el constructor espera una colección, primavera acumula todas Person-beans que puede encontrar en una Listy lo inyecta en el constructor, el establecimiento de la lista en consecuencia.

Creo (pero en este momento no probado, pero documentado aquí ), que la adición @Autowired(required = false)a su List<Person> personspropiedad es lo que desea en este caso, como que lo marca como opcional y la primavera no inyectará ella. (EDIT: me había equivocado, que aún necesita los no-args-constructor para que esto funcione, pero sin ninguna @Autowiredanotación de la lista no se obtendría inyectada de esa manera todos modos El. required=falseSimplemente evita la excepción cuando no hay adecuada Personse encuentra frijol).

EDIT: Como el Sr. Roddy, la Roddy del guisantes congelados, fuera de punta, también sería posible añadir un constructor diferente para la primavera para crear el bean, por ejemplo, al anotar su repositorio con @NoArgsConstructor

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=231660&siteId=1
Recomendado
Clasificación