Spring架構依賴注入和類的自動裝配
依賴注入
- 依賴注入的方式有3種:----你去注入屬性的時候有這3種注入方式;
- 接口注入(調用和實作分離):不常用
-
setter注入(就是使用set方法為屬性指派):set的注入,在你的這個bean(實體類中)檔案,一定要有的set方法
注:如果實體類中的屬性值是數組,集合,xml檔案注入的時候使用< list >标簽
- 構造器注入(通過構造方法指派):要進行構造方法注入的時候,一定要保證你的這個bean檔案中有先關的這個構造方法,通過标簽中的value為元素的構造方法指派
- 代碼示例:
- 依賴jar包
- 接口注入
/*
這是一個語言轉換的接口
*/
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());
}
}
運作結果
自動裝配
- autowire byName (按名稱自動裝配)
- 由于在手動配置xml過程中,常常發生字母缺漏和大小寫等錯誤,而無法對其進行檢查,使得開發效率降低。采用自動裝配将避免這些錯誤,并且使配置簡單化。
- 當一個bean節點帶有 autowire byName的屬性時。
- 将查找其類中所有的set方法名
- 去spring容器中尋找是否有此字元串名稱id的對象,如果有,就取出注入;如果沒有,就報空指針異常
- autowire byType (按類型自動裝配)
- 使用autowire byType首先需要保證:同一類型的對象,在spring容器中唯一。如果不唯一,會報不唯一的異常。
- constructor
- 根據構造器自動裝配
- 代碼示例
- 依賴jar包
- 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>-->
<!-- <!– set注入使用byName自動裝配–>-->
<!-- <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架構的依賴注入和自動裝配。