天天看點

架構--Spring架構之依賴注入和自動裝配Spring架構依賴注入和類的自動裝配

Spring架構依賴注入和類的自動裝配

依賴注入

  • 依賴注入的方式有3種:----你去注入屬性的時候有這3種注入方式;
    • 接口注入(調用和實作分離):不常用
    • setter注入(就是使用set方法為屬性指派):set的注入,在你的這個bean(實體類中)檔案,一定要有的set方法

      注:如果實體類中的屬性值是數組,集合,xml檔案注入的時候使用< list >标簽

    • 構造器注入(通過構造方法指派):要進行構造方法注入的時候,一定要保證你的這個bean檔案中有先關的這個構造方法,通過标簽中的value為元素的構造方法指派
  • 代碼示例:
  • 依賴jar包
    架構--Spring架構之依賴注入和自動裝配Spring架構依賴注入和類的自動裝配
  • 接口注入
/*
這是一個語言轉換的接口
*/
public interface ChangeLetter {
	
	public String change() throws Exception;
}
           

實作類

/*
這是語言轉換接口的一個實作類将字元串轉換成小寫
*/
public class ChangetoLowerCase implements ChangeLetter{
	
	private String str;

	public String getStr() {
		return str;
	}

	public void setStr(String str) {
		this.str = str;
	}

	@Override
	public String change() throws Exception {
		
		return str.toLowerCase();
	}	
}
           

bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.springframework.org/schema/beans"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    
    <bean id="ChangetoLowerCase" class="com.hfc.intface.ChangetoLowerCase">
    <property name="str" value="HHHHJHHHHHHHHHHHHHSDFSDFSDFSD"></property>
    </bean>    
    </beans>
           

測試類

public class Test {
	public static void main(String[] args) throws Exception {
		
		  ApplicationContext applicationContext=new
		  ClassPathXmlApplicationContext("com/hfc/intface/bean.xml"); 
		  ChangeLetter changeLetter=applicationContext.getBean("ChangetoLowerCase",
		  ChangetoLowerCase.class);
		  System.out.println( changeLetter.change());
		  }
}
           
  • 使用set和構造器注入

    這是student類

package com.wdhcr.bean;

public class Student {
    private String name;
    private int age;
    private String address;

    public Student() {

    }

    public Student(String name, int age, String address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }
}

           

Person類

package com.wdhcr.bean;

/*
* 這是實體類,有它的相關的成員變量,并生成了它的get set方法 ,
* 還有帶參構造器,和重寫了它的tostring方法
* */
public class Person {
    private String name;
    private int age;
    private Student student;

    public Student getStudent() {
        return student;
    }

    public void setStudent(Student student) {
        this.student = student;
    }

    public Person() {
    }

    public Person(String name, int age, Student student) {
        this.name = name;
        this.age = age;
        this.student = student;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
               ", student=" + student +
                '}';
    }
}


           

bean.xml檔案依賴注入

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!--    使用set的方式注入-->
    <bean id="person" class="com.wdhcr.bean.Person">
        <property name="name" value="張三"></property>
        <property name="age" value="12"></property>
        <property name="student" ref="student"></property>
    </bean>
<!--    使用構造器的方式-->
    <bean id="person1" class="com.wdhcr.bean.Person">
        <constructor-arg index="0"><value>張三</value></constructor-arg>
        <constructor-arg index="1"><value>13</value></constructor-arg>
        <constructor-arg index="2" ref="student"></constructor-arg>
    </bean>
    <bean id="student" class="com.wdhcr.bean.Student">
    <property name="name" value="國小生"></property>
    <property name="age" value="10"></property>
    <property name="address" value="北京"></property>

    </bean>
</beans>
           

測試類代碼

package com.wdhcr.test;

import com.wdhcr.bean.Person;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/*
* 這是person的測試類
* 使用spring架構建立person的一個對象
* */
public class PersonTest {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("bean.xml");
        Person person = classPathXmlApplicationContext.getBean("person", Person.class);
        System.out.println(person);
        System.out.println(person.getName()+"\t"+person.getAge());
        System.out.println("-------------");
        Person person1 = classPathXmlApplicationContext.getBean("person1", Person.class);
        System.out.println(person1);
        System.out.println(person1.getName()+"\t"+person1.getAge());
    }
}

           

運作結果

架構--Spring架構之依賴注入和自動裝配Spring架構依賴注入和類的自動裝配

自動裝配

  • autowire byName (按名稱自動裝配)
    • 由于在手動配置xml過程中,常常發生字母缺漏和大小寫等錯誤,而無法對其進行檢查,使得開發效率降低。采用自動裝配将避免這些錯誤,并且使配置簡單化。
    • 當一個bean節點帶有 autowire byName的屬性時。
      • 将查找其類中所有的set方法名
      • 去spring容器中尋找是否有此字元串名稱id的對象,如果有,就取出注入;如果沒有,就報空指針異常
  • autowire byType (按類型自動裝配)
    • 使用autowire byType首先需要保證:同一類型的對象,在spring容器中唯一。如果不唯一,會報不唯一的異常。
  • constructor
    • 根據構造器自動裝配
  • 代碼示例
  • 依賴jar包
    架構--Spring架構之依賴注入和自動裝配Spring架構依賴注入和類的自動裝配
  • Dog類
package com.wdhcr.auto;
/*
 *
 *這是dog的實體類使用xml檔案注入
 * 生成它的set get方法和帶參和無參構造
 * 重寫它的tostring方法
 * */
public class Dog {
    private String name;
    private Integer age;
    private String address;

    public Dog() {
    }

    public Dog(String name, Integer age, String address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "Dog [name=" + name + ", age=" + age + ", address=" + address + "]";
    }
}


           
  • Cat類
package com.wdhcr.auto;
/*
*
*這是cat的實體類使用xml檔案注入
* 生成它的set get方法和帶參和無參構造
* 重寫它的tostring方法
 * */
public class Cat {
    private String name;
    private Integer age;
    private String address;

    public Cat() {
    }

    public Cat(String name, Integer age, String address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }
}

           
  • User類
package com.wdhcr.auto;
/*
 *
 *這是user的實體類使用xml檔案注入
 * 生成它的set get方法和帶參和無參構造
 * 重寫它的tostring方法
 * */
public class User {
    private String name;
    private Integer age;
    private String address;
    private Dog dog;
    private Cat cat;

    public User() {
    }

    public User(String name, Integer age, String address, Dog dog, Cat cat) {
        this.name = name;
        this.age = age;
        this.address = address;
        this.dog = dog;
        this.cat = cat;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    public Cat getCat() {
        return cat;
    }

    public void setCat(Cat cat) {
        this.cat = cat;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                ", dog=" + dog +
                ", cat=" + cat +
                '}';
    }
}

           

bean.xml檔案

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

<!--    讓cat和dog根據name自動裝配-->
<!--    <bean id="user" class="com.wdhcr.auto.User" autowire="byName">-->
<!--        <property name="name" value="張三"></property>-->
<!--        <property name="age" value="14"></property>-->
<!--        <property name="address" value="北京"></property>-->
<!--    </bean>-->

<!--        讓cat和dog根據類型自動裝配-->
<!--    <bean id="user" class="com.wdhcr.auto.User" autowire="byType">-->
<!--            <property name="name" value="張三"></property>-->
<!--            <property name="age" value="14"></property>-->
<!--             <property name="address" value="北京"></property> -->
<!--        </bean>-->
<!--    使用構造器自動裝配-->
<!--    <bean id="user" class="com.wdhcr.auto.User" autowire="constructor">-->
<!--        <constructor-arg index="0" value="李四"></constructor-arg>-->
<!--        <constructor-arg index="1" value="14"></constructor-arg>-->
<!--        <constructor-arg index="2" value="北京"></constructor-arg>-->
<!--    </bean>-->
<!--    &lt;!&ndash;    set注入使用byName自動裝配&ndash;&gt;-->
<!--    <bean id="dog" class="com.wdhcr.auto.Dog" >-->
<!--        <property name="name" value="小狗"></property>-->
<!--        <property name="age" value="3"></property>-->
<!--        <property name="address" value="狗窩"></property>-->
<!--    </bean>-->
<!--    <bean id="cat" class="com.wdhcr.auto.Cat" >-->
<!--        <property name="name" value="小貓"></property>-->
<!--        <property name="age" value="2"></property>-->
<!--        <property name="address" value="貓窩"></property>-->
<!--    </bean>-->
</beans>
           
  • 測試類
package com.wdhcr.auto;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext classPathXmlApplicationContext = 
                new ClassPathXmlApplicationContext("com/wdhcr/auto/bean.xml");
        User user = classPathXmlApplicationContext.getBean("user", User.class);
        System.out.println(user);
    }
}

           
  • 以上就簡單的介紹了Spring架構的依賴注入和自動裝配。

繼續閱讀