Spring學習 ---- bean的依賴注入

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;
  • 爲屬性直接賦值
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章