bean的依賴注入
依賴裝配就是爲類中的屬性賦值,或者說初始化。
使用構造器進行依賴注入
- 根據構造方法的參數名稱爲屬性賦值(不是屬性的名稱)
<bean id="user" class="com.xust.excellent.review.User">
<constructor-arg name="name" value="zs"/>
<constructor-arg name="age" value="1"/>
<constructor-arg ref="date"/>
</bean>
注:當多個構造方法的參數名稱相同時,將會發生問題。
public User(String age){
System.out.println("字符串參數" + age);
}
public User(int age){
System.out.println("整型參數" + age);
}
<bean id="user" class="com.xust.excellent.review.User">
<constructor-arg name="age" value="20"/>
</bean>
最終配置的是String類型。
- 通過構造方法參數的索引或者類型爲屬性賦值
<bean id="user" class="com.xust.excellent.review.User">
// 索引
<constructor-arg index="0" value="zs"/>
// 類型
<constructor-arg type="java.lang.Integer" value="10"/>
<constructor-arg ref="date"/>
</bean>
通過類型或者索引都需要記住具體的參數的位置或者類型,當構造方法的參數較多時,會帶來記憶負擔,不方便使用。因此瞭解即可。
注:類型配置過程中,不會發生自動拆裝箱。
通過setter方法依賴注入
<bean id="user" class="com.xust.excellent.review.User">
<property name="name" value="zs"/>
<property name="age" value="10"/>
<property name="birthday" ref="date"/>
</bean>
使用這種方法,類中必須提供相應屬性的setter方法。
idref 和 ref 的區別:
- idref:使用id值爲屬性初始化。
- ref:使用id值對應的bean爲屬性初始化。
註解注入
- Sping默認是關閉註解的,因此需要手動開啓
<!--開啓註解-->
<context:annotation-config/>
<!--指定掃描的包的範圍-->
<context:component-scan base-package="com.github.excellent"/>
@Data
@Component
public class User {
private String name;
private Integer age;
public static void main(String[] args) {
ApplicationContext context = new
ClassPathXmlApplicationContext("bean.xml");
System.out.println(context.getBean(User.class));
}
}
- @Component 沒有配置id時,可以通過類型獲取。配置了id也可以通過類型獲取。
- 類型可以是,類的類型也可以是實現的接口的類型。
根據屬性自動注入
@Autowired自動裝配 ,當容器中含有相應類型的對象時,便會自動注入
@Data
@Component
public class User {
@Autowired
private Computer computer;
private Integer age;
@Autowired
private Stu stu;
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
System.out.println(context.getBean(User.class));
}
}
根據指定id注入
public class User {
@Autowired
private Computer computer;
private Integer age;
@Qualifier("stu")
private Stu stu;
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
System.out.println(context.getBean(User.class));
}
}
@Data
@Component("stu")
class Stu{
private String name;
}
- 一般不需要指定id,自動注入就行。
直接注入
@Value("100")
private Integer age;
- 爲屬性直接賦值