spring之自動裝配的三種方式


springIOC容器可以自動裝配Bean,需要做的僅僅是在<bean>中的autowire屬性里指定自動裝配的方式。

ByType:根據類型自動裝配。若IOC容器中有多個目標Bean類型一致的bean,在這種情況下,spring將無法判定那個bean最適合該屬性,所以不能執行自動裝配。

ByName:根據名稱自動裝配,必須將目標Bean的名稱和屬性名設置完全相同。

contructor:通過構造器自動裝配,當Bean中存在多個構造器時,此種自動裝配方式將會很復雜,不推薦使用,

Car.java

package com.gong.spring.beans.autowire;

public class Car {
    
    public Car() {
    }

    public Car(String name) {
        this.name = name;
    }
    private String name;

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Car [name=" + name + "]";
    }
    
}

Address.java

package com.gong.spring.beans.autowire;

public class Address {
    private String street;

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    @Override
    public String toString() {
        return "Address [street=" + street + "]";
    }
    
}

Student.java

package com.gong.spring.beans.autowire;
import java.util.List;
import java.util.Map;

public class Student {
    
    private String name;
    private int age;
    private double score;
    private Car car;
    private 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 double getScore() {
        return score;
    }
    public void setScore(double score) {
        this.score = score;
    }
    public Car getCar() {
        return car;
    }
    public void setCar(Car car) {
        this.car = car;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + ", score=" + score + ", car=" + car + ", address=" + address
                + "]";
    }
    
    
}

beans-autowire.xml

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

    <bean id="car" class="com.gong.spring.beans.autowire.Car" p:name="baoma"></bean>
    <bean id="address" class="com.gong.spring.beans.autowire.Address" p:street="絡南街道"></bean>
    <bean id="address2" class="com.gong.spring.beans.autowire.Address" p:street="珞獅街道"></bean>
    <!-- 
    <bean id="student" class="com.gong.spring.beans.autowire.Student" p:name="tom"
    p:age="12" p:score="99.00" p:address-ref="address" p:car-ref="car"></bean>
     -->
    <!-- 使用byName時,要裝配的bean的名字要和類文件中的setter方法中的名字保持一致,若沒有匹配的,則不裝配 
    <bean id="student" class="com.gong.spring.beans.autowire.Student" p:name="tom"
    p:age="12" p:score="99.00" autowire="byName"></bean>
    -->
    <!-- byType根據bean的類型和當前Bean的屬性自動裝配,若IOC容器中有一個以上的bean可以匹配,則會拋出異常 -->
    <bean id="student" class="com.gong.spring.beans.autowire.Student" p:name="tom"
    p:age="12" p:score="99.00" autowire="byName"></bean>
</beans>

Main.java

package com.gong.spring.beans.autowire;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        //1.創建spring的IOC容器對象
        ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-autowire.xml");
        //2.從容器中獲取Bean實例
        Student student = (Student) ctx.getBean("student"); 
        System.out.println(student.toString());
    }
}

XML配置里自動裝配的缺點:

(1)自動裝配將會裝配Bean的所有屬性,然而只需要裝配個別屬性時,自動裝配就不夠靈活;

(2)要么根據類型,要么根據名稱自動裝配,不能兩者兼顧;

(3)一般而言,在實際項目中很少使用自動裝配,因為與自動裝配功能帶來的好處相比,明確清晰的配置方式更有說服力;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM