我仍在深入学习spring依赖注入。
我的第一个类是配置类,在这里我向容器声明以加载和管理在带注释的方法中声明的bean。
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();
}
}
我的第二个类是daoRepository,它看起来像:
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);
}
}
我的运行代码如下:
@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);
}
}
神奇的MyDaoRepository包含在配置类MyConfiguration中声明的@Bean人:
MyDaoRepository(personList = [Person(name = Bagna,age = 52,career = Profession(name = professor, description =大学教授))))
我认为即使我没有要求,容器也会自动注入该对象。可能是编译器添加了@Autowired批注。我不确定。
您能否向我解释,即使我要求弹簧容器不存在,即使它们存在于容器中(例如,bean的人),我也不能要求弹簧容器不进行注入,除非我要求使用@Autowired自己进行注入注解。
答案 0 :(得分:7)
原因是spring的自动装配和lombok的Builder
首先,@Builder
添加了一个所有args构造函数MyDaoRepository(List<Person> list)
。
第二,spring自动检测到您的工厂方法@Bean public Person person()
。
现在,由于构造函数需要一个集合,因此spring会将其可以找到的所有Person
-bean累积到List
中,然后将其注入到构造函数中,并相应地设置列表。
我认为(但目前尚未测试,但已记录here),在这种情况下,您想要的是将@Autowired(required = false)
添加到List<Person> persons
属性中,因为这将其标记为可选和春天不会注入它。 (编辑:我错了,您仍然需要no-args-constructor来使其工作,但是没有任何@Autowired
批注,无论如何该列表都不会被注入。required=false
只是防止了异常当找不到合适的Person
bean时。)
编辑:冷冻豌豆的罗迪(Roddy)罗迪(Roddy)先生指出,还可以为spring添加一个不同的构造函数来创建您的bean,例如通过用@NoArgsConstructor