一、依赖注入(将spring容器中的组件注入到bean中)
我们之前学习了怎么将bean注入到容器中,接下来我们来研究一下怎么将容器中的组件注入到bean中。
1、属性注入(将组件注入到属性中)
1.1、spring提供的方式
1、spring为我们提供了一个注解@Autowire,将@Autowired注解放到JavaBean对应类的属性上,该属性的值会在JavaBean对应类创建实例之前,去看容器中是不是存在属性对应类型的组件,有的话就从容器中取,并注入到该属性中。 如果不存在就报错,要想没有不报错,可以使用@Autowired的一个属性require=false。如果容器中存在多个同类型的组件,那么就会用属性的名字去匹配组件名。
2、;@Autowire还可以与@Qualifier注解连用。直接指定组件名去注入。
3、@Autowire支持@Primary【标注了@Primary注解的组件在按类型注入时会被优先选择】
@Component("qinglong")
public class PersonPojo {
private String title = "青龙";//称号
private String name = "宁仲";//真实姓名
@Autowired//将容器中SkillPojo类型组件的注入到属性中
@Qualifier("skillPojo")
private SkillPojo skillPojo;//武器类
}
@Component("ghost")
@Primary//按类型注入时,这个组件会被优先选择
public class SkillPojo {
private String name="以身饲鬼术";//武器名称
private String type="召唤类";//武器功能
@Override
public String toString() {
return "SkillPojo{" +
"name='" + name + '\'' +
", type='" + type + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
1.2、jdk提供的方式
jdk为我们提供了@Resoure注解。它可以直接指定组件名注入也可以指定类型注入,不需要与其他注解连用。但是它不支持@Primary注解
@Component("qinglong")
public class PersonPojo {
private String title = "青龙";//称号
private String name = "宁仲";//真实姓名
//@Resource(type = SkillPojo.class)//按组件类型注入
@Resource(value="skillPojo")//按组件名称注入
private SkillPojo skillPojo;//武器类
}
1.3、第三方提供的方式
既然是第三方提供的,我们就要导入第三方jar包。它的提供注解是@Inject。@Inject功能基本和@AutoWire注解一致。
它支持@Primary注解
它默认是按类型注入的,可以与@Qualifier注解连用。直接指定组件名去注入。
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
2、方法注入(将组件注入到属性中)
将@Autowired注解放在方法上,方法可以有任意名称和任意数量的参数;每个参数都将与Spring容器中的匹配bean自动连接。Bean属性setter方法实际上只是这种通用配置方法的一个特例。这