zoukankan      html  css  js  c++  java
  • Spring学习笔记 5. 尚硅谷_佟刚_Spring_自动装配

    1,回顾以前的做法

    一个人有姓名,有住址,有一辆车。其中住址和车也是一个类,这种情况下不用自动装配是十分容易实现的

    (1)Person类

    package com.zsq;
    
    public class Person {
        private String name;
        private Address address;
        private Car car;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Address getAddress() {
            return address;
        }
        public void setAddress(Address address) {
            this.address = address;
        }
        public Car getCar() {
            return car;
        }
        public void setCar(Car car) {
            this.car = car;
        }
        @Override
        public String toString() {
            return "Person [name=" + name + ", address=" + address + ", car=" + car + "]";
        }
    }

    (2)Address类

    package com.zsq;
    
    public class Address {
        private String city;
        private String street;
        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 + "]";
        }    
    
    }

    (3)Car类

    package com.zsq;
    
    public class Car {
        private String brand;
        private double price;
        public String getBrand() {
            return brand;
        }
        public void setBrand(String brand) {
            this.brand = brand;
        }
        public double getPrice() {
            return price;
        }
        public void setPrice(double price) {
            this.price = price;
        }
        @Override
        public String toString() {
            return "Car [brand=" + brand + ", price=" + price + "]";
        }
    }

    (4)配置文件

    <?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="address" class="com.zsq.Address" 
            p:city="beiji" p:street="dawumen"></bean>
            
        <bean id="car" class="com.zsq.Car"
            p:brand="audi" p:price="30000"></bean>
    
        <bean id="person" class="com.zsq.Person"
            p:name="lihai" p:address-ref="address" p:car-ref="car"></bean>
    </beans>

    (5)主方法

    package com.zsq;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Main {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-autowire.xml");
            Person person = (Person) ctx.getBean("person");
            System.out.println(person);
        }
    
    }

    (6)运行结果

    image

    2,自动装配该怎么实现?

    先看一下怎么使用,在person的bean中,不用自动装配使用的时候必须指定使用外部的某个bean

    <bean id="person" class="com.zsq.Person" p:name="lihai" p:address-ref="address" p:car-ref="car"></bean>

    但是使用自动装配则可以不指定,如下图所示,可以选择图中第一个属性值byName

    <bean id="person" class="com.zsq.Person" p:name="lihai" autowire="byName"></bean>

    image

    对于上面的5种装配模式,下面这个表很好的介绍,表截取自http://blog.csdn.net/xiao_jun_0820/article/details/7233139

    image

    下面来演示一番:对于第一节的完整程序,现在只修改其中的一部分配置文件

    <bean id="person" class="com.zsq.Person" p:name="lihai" autowire="byName"></bean>

    那么这样也是正常执行,和原来结果一样。通过byName使得person的bean在需要Car和Address的bean时候,会在配置文件中找是否存在名称为car和address的bean,如果有则自动装配,如果没有则为null。比如把<bean id="address" class="com.zsq.Address" p:city="beiji" p:street="dawumen"></bean> 换为<bean id="address1" class="com.zsq.Address" p:city="beiji" p:street="dawumen"></bean> 那么就会出现下面的结果

    image

    现在已经把address的bean修改为id为address1的bean,对于byName是不能装配该bean的,但是如果把byName换为byType,那么还是可以装配id为address1的bean的。<bean id="person" class="com.zsq.Person" p:name="lihai" autowire="byType"></bean>因为此时不在以名字来装配,而是使用类型来装配。但是会引发另一个问题:如果相同类型有两个bean呢,那就会出现异常。

    <?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="address1" class="com.zsq.Address" 
            p:city="beiji" p:street="dawumen"></bean>
            
        <bean id="address2" class="com.zsq.Address" 
            p:city="shanghai" p:street="shanxilu"></bean>    
            
        <bean id="car" class="com.zsq.Car"
            p:brand="audi" p:price="30000"></bean>
    
        <bean id="person" class="com.zsq.Person"
            p:name="lihai" autowire="byType"></bean>
    </beans>

    异常信息:希望匹配到一个bean却发现了两个。不知道具体装配哪个。

    No qualifying bean of type [com.zsq.Address] is defined: expected single matching bean but found 2: address1,address2

    3,其他

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

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

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

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

    XML 配置里的 Bean 自动装配的缺点

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

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

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

  • 相关阅读:
    Vue2.0的变化(2)———vue2.0动画的变化、vue-2.0路由的变化
    Vue2.0的变化(1)——vue2.0组件定义/生命周期/循环/自定义键盘/过滤器/组件通信的变化
    YK-iSystem后台管理系统介绍
    通过docker,部署SpringCloud项目
    Quarz框架学习
    安装CentOS6.9虚拟机
    消息中间件JMS(三)
    消息中间件JMS(二)
    消息中间件JMS(一)
    网页静态化技术Freemarker
  • 原文地址:https://www.cnblogs.com/yefengyu/p/5118094.html
Copyright © 2011-2022 走看看