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.
La razón es la combinación de autowiring de primavera de las colecciones y de Lombok Builder
En primer lugar, la @Builder
añ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 List
y 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> persons
propiedad 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 @Autowired
anotación de la lista no se obtendría inyectada de esa manera todos modos El. required=false
Simplemente evita la excepción cuando no hay adecuada Person
se 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