zoukankan      html  css  js  c++  java
  • Spring基于xml的构造方法注入&setter注入

    http://blog.csdn.net/weixin_36146275/article/details/62888672


    Spring的依赖注入分为:接口注入、构造方法注入、setter注入。

    本篇博客实现后两种依赖注入方法——基于xml的构造方法注入与setter注入。

    使用Spring框架需要使用5个依赖架包:beans、context、core、expression、logging


    这里博主提供jar包的下载地址:【http://pan.baidu.com/s/1bpahZiB】


    一、构造方法注入

    此节需要用到三个类:User类,Test测试类,application.xml配置文件

    User类:有id、name、age三个字段,并设置3个字段的setterAndGetter方法,并且创建带有id与name,name与age字段的构造方法

    创建构造方法的快捷方式:在代码编辑框处右击→source→generate construct using fieds.在选择框中再选中需要的参数点击OK就创建好了。

    项目结构如下:


    1)User类:

    [java] view plain copy
     print?
    1. /** 
    2.  * 构造方法注入: 
    3.  * 1、为字段生成setterAndGetter方法 
    4.  * 2、再为User构造两个方法,传参分别是【id、name】【name、age】 
    5.  * 3、右击→source→generate toString()方法,作测试用。toString()方法可以输出User类所有字段值 
    6.  * @author Administrator 
    7.  * 
    8.  */  
    9. public class User {  
    10.   
    11.     private Integer id;  
    12.     private String name;  
    13.     private Integer age;  
    14.   
    15.     public User(Integer id, String name) {  
    16.         super();  
    17.         this.id = id;  
    18.         this.name = name;  
    19.     }  
    20.   
    21.     public User(String name, Integer age) {  
    22.         super();  
    23.         this.name = name;  
    24.         this.age = age;  
    25.     }  
    26.   
    27.     public Integer getId() {  
    28.         return id;  
    29.     }  
    30.   
    31.     public void setId(Integer id) {  
    32.         this.id = id;  
    33.     }  
    34.   
    35.     public String getName() {  
    36.         return name;  
    37.     }  
    38.   
    39.     public void setName(String name) {  
    40.         this.name = name;  
    41.     }  
    42.   
    43.     public Integer getAge() {  
    44.         return age;  
    45.     }  
    46.   
    47.     public void setAge(Integer age) {  
    48.         this.age = age;  
    49.     }  
    50.   
    51.     @Override  
    52.     public String toString() {  
    53.         return "User [id=" + id + ", name=" + name + ", age=" + age + "]";  
    54.     }  
    55.   
    56. }  


    2)配置application.xml文件:

    我们约定俗成把配置文件命名为application.xml,也有一些人会命名为beans.xml。

    2.1)new一个application.xml文件:

    [java] view plain copy
     print?
    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.       
    7. </beans>  

    beans中的内容是我到spring官网copy过来的

    【http://docs.spring.io/spring/docs/5.0.0.M5/spring-framework-reference/htmlsingle/#beans-factory-class】

    打开网页后【ctrl+f】搜索【daos.xml】就可以copy了,copy过来会报错,因为缺少beans的结束标签</beans>,添加上就ok了


    2.2)把User类配置给Spring管理

    <bean>标签的class属性值要指定目标类,即需要给Spring管理的类。

    class="全限定类名"

    获取方法:


    [java] view plain copy
     print?
    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.           
    7.     <!-- 构造方法注入 -->  
    8.     <bean id="userId" class="com.demo.User">  
    9.         <constructor-arg index="0" type="java.lang.Integer" value="9527"></constructor-arg>   
    10.         <constructor-arg index="1" type="java.lang.String" value="周星星"></constructor-arg>  
    11.     </bean>  
    12.   
    13. </beans>  
    id:任意命名,要易于区分

    class:要被spring管理的类,【class="包名.类名"】

    <constructor-arg>标签:顾名思义就是"构造方法的参数"

    index:构造方法参数所在位置的索引值

    type:参数的类型

    value:为参数赋值

    到这里就完成了Spring管理User类的配置。

    3)验证User类是否已经被Spring管理

    new一个TestIOC测试类:@Test注解的意思是使用 JUnit 测试工具,具体的使用方法,这里不做细说

    使用@Test 的原因是方便做测试,不用写main方法。

    [java] view plain copy
     print?
    1. import org.junit.Test;  
    2. import org.springframework.context.ApplicationContext;  
    3. import org.springframework.context.support.ClassPathXmlApplicationContext;  
    4.   
    5. /** 
    6.  * 功能: 
    7.  * 测试Spring是否已经管理User类 
    8.  * @author Administrator 
    9.  * 
    10.  */  
    11. public class TestIoc {  
    12.       
    13.     @Test  
    14.     public void demo01(){  
    15.         //spring工厂,加载xml配置文件  
    16.         String xmlPath = "com/demo/application.xml";  
    17.         ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);  
    18.         //根据xml配置文件的设置,获取bean实例  
    19.         User user = (User) applicationContext.getBean("userId");  
    20.         System.out.println(user);  
    21.     }  
    22. }  
    xmlPath:右击application.xml文件→copy Qualified Name→删除【 项目名/src 】之后就是xml文件路径

    userId:就是application.xml文件中配置<bean id="userId" >的值


    输出结果:这就是Spring的控制反转,将创建实例的权利反转给Spring去管理,由它去创建实例。



    二、setter注入

    setter注入与构造方法注入都要配置XML文件,最大区别是配置的方式不同。

    这里准备用Person类与Address类来演示setter注入,他们的关系如下:



    1)创建Person类、Address类

    Person类:为4个字段创建setterAndGetter方法,再创建一个toString()方法,用来输出字段的值。

    它的值來自Spring的配置文件application.xml。

    [java] view plain copy
     print?
    1. public class Person {  
    2.       
    3.     private String name;  
    4.     private Integer age;  
    5.     private Address homeAddress;//家庭住址  
    6.     private Address companyAddress;//公司住址  
    7.     public String getName() {  
    8.         return name;  
    9.     }  
    10.     public void setName(String name) {  
    11.         this.name = name;  
    12.     }  
    13.     public Integer getAge() {  
    14.         return age;  
    15.     }  
    16.     public void setAge(Integer age) {  
    17.         this.age = age;  
    18.     }  
    19.     public Address getHomeAddress() {  
    20.         return homeAddress;  
    21.     }  
    22.     public void setHomeAddress(Address homeAddress) {  
    23.         this.homeAddress = homeAddress;  
    24.     }  
    25.     public Address getCompanyAddress() {  
    26.         return companyAddress;  
    27.     }  
    28.     public void setCompanyAddress(Address companyAddress) {  
    29.         this.companyAddress = companyAddress;  
    30.     }  
    31.     @Override  
    32.     public String toString() {  
    33.         return "Person [name=" + name + ", age=" + age + ", homeAddress=" + homeAddress + ", companyAddress="  
    34.                 + companyAddress + "]";  
    35.     }  
    36. }  


    Address:为addrsss、tel字段创建setterAndGetter方法,再创建一个toString()方法,

    右击→source→generate toString()方法,作测试用。toString()方法可以输出User类所有字段值。

    [java] view plain copy
     print?
    1. public class Address {  
    2.       
    3.     private String address;//地址  
    4.     private String tel;//联系电话  
    5.       
    6.     public String getAddress() {  
    7.         return address;  
    8.     }  
    9.     public void setAddress(String address) {  
    10.         this.address = address;  
    11.     }  
    12.     public String getTel() {  
    13.         return tel;  
    14.     }  
    15.     public void setTel(String tel) {  
    16.         this.tel = tel;  
    17.     }  
    18.     @Override  
    19. <span style="white-space:pre">  </span>public String toString() {  
    20. <span style="white-space:pre">      </span>return "Address [address=" + address + ", tel=" + tel + "]";  
    21. <span style="white-space:pre">  </span>}  
    22. }  


    2)配置application.xml文件:

    构造方法注入使用的是<construct-arg>标签对字段进行赋值,而setter方法注入使用的是<property>标签对字段赋值。

    注意:<property name=" ">,name的值必须与目标类(Person)的字段【一致】,否则程序运行会报"Error setting property values"的错误。

    赋值有两种形式:

    [java] view plain copy
     print?
    1. 第一种:<strong>以name="" value="" 形式赋值,也叫普通值</strong>。<property name="name" value="郭靖">表示将目标类的"name"字段赋值为"郭靖"  

    [java] view plain copy
     print?
    1. 第二种:<strong>以name="" ref="" 形式赋值,也叫引用值</strong>。<property name="homeAddress" ref="homeAddressId">表示将目标类的homeAddress字段赋值为"引用bean的值,bean的id=homeAddressId"  
    [java] view plain copy
     print?
    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.           
    7.     <!-- setter方法注入 -->   
    8. <bean id="personId" class="com.demo1.Person">  
    9.     <property name="name" value="郭靖"></property>  
    10.     <property name="age" value="18"></property>  
    11.     <property name="homeAddress" ref="homeAddressId"></property>  
    12.     <property name="companyAddress" ref="companyAddressId"></property>   
    13. </bean>  
    14. <bean id="homeAddressId" class="com.demo1.Address">  
    15.     <property name="address" value="越秀区"></property>  
    16.     <property name="tel" value="123456"></property>  
    17. </bean>  
    18. <bean id="companyAddressId" class="com.demo1.Address">  
    19.     <property name="address" value="天河区"></property>  
    20.     <property name="tel" value="654321"></property>  
    21. </bean>  
    22.   
    23. </beans>  


    3)创建测试类查看配置结果:

    [java] view plain copy
     print?
    1. import org.junit.Test;  
    2. import org.springframework.context.ApplicationContext;  
    3. import org.springframework.context.support.ClassPathXmlApplicationContext;  
    4.   
    5. public class TestSetter {  
    6.       
    7.     @Test  
    8.     public void test(){  
    9.         //加载Spring配置文件  
    10.         String xmlPath = "com/demo1/application.xml";  
    11.         ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);  
    12.         Person person = (Person) applicationContext.getBean("personId");//通过Spring获取Person的实例  
    13.         System.out.println(person);  
    14.     }  
    15. }  

    Person类以及Address类字段都已经有值

    homeAddress跟companyAddress看起怪怪的,可以到Address类的toString()方法中删除Address:


    这下好多了。


    小结:构造方法注入与setter注入仅有一小点差异,最后都能达到同样的效果——控制反转(IOC),将new一个实例的权利反转给Spring去管理,让Spring通过配置文件去new一个实例。构造方法是使用<construct-arg index="" type="" value="">标签进行注入,setter是使用<property name="" value="">标签进行注入,两者都是基于xml配置文件进行操作。还有一种方法是基于注解注入,可以替代基于xml的繁琐配置过程。


  • 相关阅读:
    TFS 安装遇到的问题
    批量将MP4 转换为 MP3
    sqlite like 通配符 ,匹配区分大小写(默认不区分大小写)
    AutoCAD 2007-2012 长度统计工具
    python27 ImportError: No module named site
    github push时,要求密码的问题
    sqlserver中自定义计算函数
    关于win10家庭版不能开启虚拟机的问题
    js的MD5实现
    高德各省行政区显示不同区别颜色(转)
  • 原文地址:https://www.cnblogs.com/silyvin/p/9106717.html
Copyright © 2011-2022 走看看