zoukankan      html  css  js  c++  java
  • Spring4自动装配(default-autowire)

    §1 什么是自动装配? 

    Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系。因此,如果可能的话,可以自动让Spring通过检查BeanFactory中的内容,来替我们指定bean的协作者(其他被依赖的bean)。

    简而言之,就是对于bean当中引用的其他bean不需要我们自己去配置它改使用哪个类,Spring 的自动装配可以帮助我们完成这些工作。

    §2 自动装配的意义?
    引用
    理解自动装配的优缺点是很重要的。其中优点包括:

    自动装配能显著减少配置的数量。不过,采用bean模板(见这里)也可以达到同样的目的。

    自动装配可以使配置与java代码同步更新。例如,如果你需要给一个java类增加一个依赖,那么该依赖将被自动实现而不需要修改配置。因此强烈推荐在开发过程中采用自动装配,而在系统趋于稳定的时候改为显式装配的方式。
    §3 自动装配有几种类型?  

     
    5种模式 说明 

    通过配置default-autowire 属性,Spring IOC 容器可以自动为程序注入bean;默认是no,不启用自动装配;
    default-autowire 的类型有byName,byType,constructor;
    byName:通过名称进行自动匹配;
    byType:根据类型进行自动匹配;
    constructor:和byType 类似,只不过它是根据构造方法注入而言的,根据类型,自动注入;

    byName 根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自
    动装配。例如,在bean定义中将 autowire设置为by name,而该bean包含master属性(同时提供
    setMaster(..)方法),Spring就会查找名为master的bean定义,并用它来装配给master属性

    byType 如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的
    bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,
    则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置
    dependency-check="objects"让Spring抛出异常。

    constructor 与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类
    型一致的bean,那么将会抛出异常。

    autodetect 通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。
    如果发现默认的构造器,那么将使用byType方式。


    建议:自动装配机制慎用,它屏蔽了装配细节,容易产生潜在的错误;



     
    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.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
    5.         http://www.springframework.org/schema/beans/spring-beans.xsd"  
    6.         default-autowire="byName">  
    7.  <bean id="car2" class="com.zhiqi.model.Car">  
    8.         <property name="id" value="2007"></property>  
    9.         <property name="carName" value="奥迪"></property>  
    10.     </bean>  
    11.     <!-- 自动装配 byName 来找car -->  
    12.     <bean id="car" class="com.zhiqi.model.Car">  
    13.         <property name="id" value="2009"></property>  
    14.         <property name="carName" value="奥拓"></property>  
    15.     </bean>  
    16.   
    17.  <bean id="employee" class="com.zhiqi.model.Employee">  
    18.         <property name="id" value="10080"></property>  
    19.         <property name="name" value="贾经理"></property>  
    20.         <property name="sex" value="男"></property>  
    21.   
    22.   </bean>  
    23.       
    24. </beans>  



    1. public class Car {  
    2.   
    3.   
    4.     private int id;  
    5.     private String carName;  
    6.     public int getId() {  
    7.         return id;  
    8.     }  
    9.     public void setId(int id) {  
    10.         this.id = id;  
    11.     }  
    12.     public String getCarName() {  
    13.         return carName;  
    14.     }  
    15.     public void setCarName(String carName) {  
    16.         this.carName = carName;  
    17.     }  
    18. }  
    1. public class Employee {  
    2.   
    3.   
    4.     private int id;  
    5.     private String name;  
    6.     private String sex;  
    7.     private Car car;  
    8.   
    9.   
    10.     public Employee() {  
    11.         super();  
    12.         // TODO Auto-generated constructor stub  
    13.     }  
    14.     public Employee(int id, String name, String sex) {  
    15.         super();  
    16.         this.id = id;  
    17.         this.name = name;  
    18.         this.sex = sex;  
    19.     }  
    20.   
    21.   
    22.     public int getId() {  
    23.         return id;  
    24.     }  
    25.     public void setId(int id) {  
    26.         this.id = id;  
    27.     }  
    28.     public String getName() {  
    29.         return name;  
    30.     }  
    31.     public void setName(String name) {  
    32.         this.name = name;  
    33.     }  
    34.     public String getSex() {  
    35.         return sex;  
    36.     }  
    37.     public void setSex(String sex) {  
    38.         this.sex = sex;  
    39.     }  
    40.     public Car getCar() {  
    41.         return car;  
    42.     }  
    43.     public void setCar(Car car) {  
    44.         this.car = car;  
    45.     }  
    46. }  

    public class MyTest {  

    1.       
    2.     public static void main(String[] args) {  
    3.         ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");  
    4.         Employee employee=(Employee)ac.getBean("employee");  
    5.         //employee.setName("李经理");//在xml中属性注入  
    6.         System.out.println(employee.getCar().getCarName());  
    7.   
    8.   
    9.     }  
    10. }  

    【byType】

     
    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.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
    5.         http://www.springframework.org/schema/beans/spring-beans.xsd"  
    6.         default-autowire="byType">  
    7.   
    8.     <!-- 自动装配 byType 有两个相同类型会报错 -->  
    9.     <bean id="car2" class="com.zhiqi.model.Car">  
    10.         <property name="id" value="2007"></property>  
    11.         <property name="carName" value="奥迪"></property>  
    12.     </bean>  
    13.     <!-- 自动装配 byType 来找car -->  
    14.     <bean id="car" class="com.zhiqi.model.Car">  
    15.         <property name="id" value="2009"></property>  
    16.         <property name="carName" value="奥拓"></property>  
    17.     </bean>  
    18.   
    19.     <bean id="employee" class="com.zhiqi.model.Employee">  
    20.         <property name="id" value="10080"></property>  
    21.         <property name="name" value="贾经理"></property>  
    22.         <property name="sex" value="男"></property>  
    23.   
    24.     </bean>  
    25.       
    26. </beans>  


    测试:

     
    1. public class MyTest {  
    2.       
    3.     public static void main(String[] args) {  
    4.         ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");  
    5.         Employee employee=(Employee)ac.getBean("employee");  
    6.         //employee.setName("李经理");//在xml中属性注入  
    7.         System.out.println(employee.getCar().getCarName());  
    8.   
    9.     }  
    10. }  


    运行:

    【default-autowire="constructor"】

    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.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
    5.         http://www.springframework.org/schema/beans/spring-beans.xsd"  
    6.         default-autowire="constructor">  
    7.   
    8.     <!-- 自动装配 constructor 需要写单参构造方法 -->  
    9.     <bean id="car3" class="com.zhiqi.model.Car">  
    10.         <property name="id" value="2007"></property>  
    11.         <property name="carName" value="奥迪"></property>  
    12.     </bean>  
    13.   
    14.   
    15.     <bean id="employee" class="com.zhiqi.model.Employee">  
    16.         <property name="id" value="10080"></property>  
    17.         <property name="name" value="贾经理"></property>  
    18.         <property name="sex" value="男"></property>  
    19.   
    20.     </bean>  
    21.       
    22. </beans>  

     
      1. 自动装配 constructor 需要写单参构造方法  

    转载自:

  • 相关阅读:
    Haproxy基于ACL做访问控制
    K8s之Prometheus监控
    kubernetes之PV及PVC案例
    K8s常见示例
    K8s之Web服务
    Ansible 部署k8s
    K8s之网络通信
    创建资源对象实例
    kubeadm搭建K8s集群
    Go基础之函数递归实现汉诺塔
  • 原文地址:https://www.cnblogs.com/PengChengLi/p/10516939.html
Copyright © 2011-2022 走看看