zoukankan      html  css  js  c++  java
  • 自动装配

    【XML配置里的Bean自动装配】

    1.Spring IOC容器可以自动装配Bean。需要做的就是仅仅在<bean>的autowire属性里指定自动装配的模式

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

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

    --constructor(通过构造器自动装配):当Bean中存在多个构造器时,此种自动装配方式将会很复杂。不推荐使用

    (1)当使用p标签配置时:

    配置文件代码:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xmlns:p="http://www.springframework.org/schema/p"
     5     xsi:schemaLocation="http://www.springframework.org/schema/beans
     6         http://www.springframework.org/schema/beans/spring-beans.xsd">
     7 
     8   <bean id="address" class="com.hk.beans.autowire.Address"
     9         p:city="Beijing" p:street="GuoMao"></bean>
    10         
    11   <bean id="car" class="com.hk.beans.autowire.Car"
    12         p:brand="Audi" p:price="300000"></bean>
    13  
    14   <bean id="person" class="com.hk.beans.autowire.Person"
    15         p:name="Tom" p:address-ref="address" p:car-ref="car"></bean>
    16 
    17 </beans>

    运行结果:

    1 Person [name=Tom, address=Address [city=Beijing, street=GuoMao], car=Car [brand=Audi, price=300000.0]]

    (2)当用自动装配时:

    (i)byName方式:根据bean的名字和当前bean的setter风格的属性名进行自动装配。若有匹配的,则进行自动装配,没有匹配的则不装配。

    配置文件代码:

    运行结果:

    1 Person [name=Tom, address=Address [city=Beijing, street=GuoMao], car=Car [brand=Audi, price=300000.0]]

    注意:在配置文件中配置bean时,id属性的值必须和javabean代码的变量名相同。

    否则:

    配置文件中:

    运行结果:

    (ii)byType方式:根据bean的类型和当前bean的属性的类型进行自动装配。

    配置文件代码:

    1   <bean id="person" class="com.hk.beans.autowire.Person"
    2         p:name="Tom" autowire="byType"></bean>

    运行结果:

    1 Person [name=Tom, address=Address [city=Beijing, street=GuoMao], car=Car [brand=Audi, price=300000.0]]

    注:但是,当配置文件中由两个及以上的相同类型的bean时,会发生错误。

    如:

    配置文件中有:

    1   <bean id="address" class="com.hk.beans.autowire.Address"
    2         p:city="Beijing" p:street="GuoMao"></bean>
    3 
    4   <bean id="address2" class="com.hk.beans.autowire.Address"
    5         p:city="Shanghai" p:street="Songjianglu"></bean>

    运行时会出现以下错误:

     No qualifying bean of type [com.hk.beans.autowire.Address] is defined: expected single matching bean but found 2: address,address2

    【自动装配的缺点】

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

    2.autowire属性要么根据类型自动装配,要么根据名称自动装配,不能两者兼而有之。

    3.一般情况下,在实际项目中很少使用自动装配因为和自动装配所带来的好处相比,明确清晰的配置文档更有说服力。

    【附录】

    Address.java:

     1 package com.hk.beans.autowire;
     2 
     3 public class Address {
     4     private String city;
     5     private String street;
     6     
     7     public String getCity() {
     8         return city;
     9     }
    10     public void setCity(String city) {
    11         this.city = city;
    12     }
    13     public String getStreet() {
    14         return street;
    15     }
    16     public void setStreet(String street) {
    17         this.street = street;
    18     }
    19     @Override
    20     public String toString() {
    21         return "Address [city=" + city + ", street=" + street + "]";
    22     }
    23 }

    Car.java:

     1 package com.hk.beans.autowire;
     2 
     3 public class Car {
     4     private String brand;
     5     private double price;
     6     
     7     public String getBrand() {
     8         return brand;
     9     }
    10     public void setBrand(String brand) {
    11         this.brand = brand;
    12     }
    13     public double getPrice() {
    14         return price;
    15     }
    16     public void setPrice(double price) {
    17         this.price = price;
    18     }
    19     @Override
    20     public String toString() {
    21         return "Car [brand=" + brand + ", price=" + price + "]";
    22     }
    23 }

    Person.java:

     1 package com.hk.beans.autowire;
     2 
     3 public class Person {
     4     private String name;
     5     private  Address address;
     6     private Car car;
     7     
     8     public String getName() {
     9         return name;
    10     }
    11     public void setName(String name) {
    12         this.name = name;
    13     }
    14     public Address getAddress() {
    15         return address;
    16     }
    17     public void setAddress(Address address) {
    18         this.address = address;
    19     }
    20     public Car getCar() {
    21         return car;
    22     }
    23     public void setCar(Car car) {
    24         this.car = car;
    25     }
    26     @Override
    27     public String toString() {
    28         return "Person [name=" + name + ", address=" + address + ", car=" + car
    29                 + "]";
    30     }
    31 }
    每接触一个新领域,我就像一块掉进水里的海绵,四面八方的养分都让我不断充实。O(∩_∩)O~
  • 相关阅读:
    【leetcode】1630. Arithmetic Subarrays
    【leetcode】1629. Slowest Key
    【leetcode】1624. Largest Substring Between Two Equal Characters
    【leetcode】1620. Coordinate With Maximum Network Quality
    【leetcode】1619. Mean of Array After Removing Some Elements
    【leetcode】1609. Even Odd Tree
    【leetcode】1608. Special Array With X Elements Greater Than or Equal X
    【leetcode】1603. Design Parking System
    【leetcode】1598. Crawler Log Folder
    Java基础加强总结(三)——代理(Proxy)Java实现Ip代理池
  • 原文地址:https://www.cnblogs.com/zhzcode/p/9603540.html
Copyright © 2011-2022 走看看