1、 三层组件
- 通过@Autowired从Ioc容器中 根据类型(默认)自动注入( 两个位置 )
- -如果@Autowired在属性前标注,则不调用setXxx;
- -如果标注在setXxx前面 ,则调用setXxx
- -不能放在方法的参数前
2、Bean+返回值:
- @Autowired 在方法的参数前(也可以省略)、方法前 (构造方法:特殊,如果只有一个 有参构造 方法,则构造方法前的@Autowired也可以省略)
@Bean
public Student myStudent( @Autowired Address address1) {
Student ls = new Student("ls", 23);
ls.setAddress(address1); //Address 必须加入ioc容器
return ls;
}
@Autowired 三大问
-
1.如果有多个类型相同的,匹配哪个?
- 报错。 /默认值@primary
- bean+返回值 : 如果有多个bean 会根据参数名确定(有版本依赖),如果参数名找不到 ,则报错
-
2.能否根据名字匹配?
- 可以,结合 @Qualifier(“stuDao2”)使用。 bean+返回值 写到参数前(可以省略)
-
3.如果有0个类型相同,默认报错;可以修改成不注入(null),@Autowired(required=false)
自动装配的方式
自动注入方式一: @Autowired (Spring) ,默认根据类型
自动注入方式二: @Resource(JSR250),
- 默认根据名字(id名) (如果 有名字,根据名字匹配;如果没有名字,先根据名字查找,如果没找到,再根据类型查找);也可以通过name或type属性 指定根据名字 或类型找。
@Resource
private StudentService studentService;
//写一个就好(建议)
//两个同时写 任何一个 不一致都会报错
@Resource(name = "studentService",type = StudentService.class)
private StudentService studentService;
自动注入方式一: @Inject(JSR330),额外引入javax.inject.jar,默认根据类型匹配
@Inject//根据类型
private StudentDao studentDao;