spring 自动装配

--SpringIOC容器可以自动装配Bean,需要做的仅仅是在<bean>的autowire属性指定自动装配模式

--byType:根据类型自动装配,若IOC容器中有多个与目标Bean类型一致的Bean,在这种情况下,Spring将无法判断那个Bean最合适属性,所以不能进行自动装配。

--byName:根据名称自动装配,必须将目标Bean的名称(id值)和属性名设置的完全相同。

 

缺点:

--在Bean配置文件里设置autowire属性进行自动装配将会配置Bean的所有属性,然而,若只想装配个别属性时,不够灵活。

--autowire属性要么根据类型,要么根据名称自动装配,不能同时指定。

--一般情况下很少使用自动装配功能,因为明确指定更有说服力。

 

例子:

Person类:

 

package com.xia.entity;

public class Person {
    private String name;
    private int age;
    private Car car;
    private Address address;

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", car=" + car + ", address=" + address + "]";
    }
    
    public Car getCar() {
        return car;
    }
    public Address getAddress() {
        return address;
    }

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

    public void setCar(Car car) {
        this.car = car;
    }
    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;
    }
    
    
}

 

Car类:

package com.xia.entity;

public class Car {
    private String cname;
    private double price;
    public Car(String cname, double price) {
        super();
        this.cname = cname;
        this.price = price;
    }
    
    
    @Override
    public String toString() {
        return "Car [cname=" + cname + ", price=" + price + "]";
    }


    public Car() {
        super();
    }
    
    public String getCname() {
        return cname;
    }
    public void setCname(String cname) {
        this.cname = cname;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    
    
    
}    

Address类:

package com.xia.entity;

public class Address {
    private String city;
    private String street;
    
    public Address() {
        super();
        // TODO Auto-generated constructor stub
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getStreet() {
        return street;
    }

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

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

byName:

     <bean id="address" class="com.xia.entity.Address">
         <property name="city" value="beijing"></property>
         <property name="street" value="huiLongGang"></property>
     </bean>
     
     <bean id="car" class="com.xia.entity.Car">
         <property name="cname" value="宝马"></property>
         <property name="price">
             <value>188</value>
         </property>
     </bean>
     <!-- 可以使用autowire属性指定自动装配的方式,
     byName 根据bean的名字和当前bean的属性名进行自动装配 ,若有匹配的则进行自动装配,若没有匹配的则不匹配。
    -->
        <bean id="personBean" class="com.xia.entity.Person" autowire="byName">
            <property name="name" value="夏文杰"></property>
            <property name="age">
                <value>18</value>
            </property>
        </bean>

byType:

 <!--byType 根据bean的类型和当前Bean的属性的类型进行自动装配,若IOC容器中有一个以上的类型匹配bean,则抛异常-->
        <bean id="personBean" class="com.xia.entity.Person" autowire="byType">
            <property name="name" value="夏文杰"></property>
            <property name="age">
                <value>18</value>
            </property>
        </bean>

Test:

ApplicationContext ac = new ClassPathXmlApplicationContext("ApplicationContext.xml");
        Person p = (Person) ac.getBean("personBean");
        System.out.println(p.toString());

输出:

Person [name=夏文杰, age=18, car=Car [cname=宝马, price=188.0], address=Address [city=beijing, street=huiLongGang]]

 

posted @ 2016-09-29 13:26  夏文杰  阅读(93)  评论(0)    收藏  举报