zoukankan      html  css  js  c++  java
  • Spring学习(3)---Spring设值注入和构造注入

    (一)设值注入就是指要被注入的类中定义有一个setter()方法,并在参数中定义需要注入的对象。简单的看个例子。

    建一个User类:

    package com.ioc;
    
    public class User {
        private String name ;
        private int age ;
        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;
        }
        public String printInfo(){
            return "name : "+ name +" ; age : "+age; 
        }
    }
    

     spring-ioc.xml配置(具体取名随意,保持调用时一致即可)

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"  
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
           xsi:schemaLocation="http://www.springframework.org/schema/beans  
               http://www.springframework.org/schema/beans/spring-beans-4.1.xsd">  
          
        <bean id="user" class="com.ioc.User">  
            <property name="name" value="Json" />  
            <property name="age" value="25" />  
        </bean>  
    
    </beans>
    

     测试: 

    package com.ioc;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class SpingTest {
    
        @Test
        public void test(){
            ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-ioc.xml") ;  
            User user = (User)context.getBean("user") ;  
            System.out.println(user.printInfo()) ;  
    
        }
    }
    

    PS:这里用到了单元测试,稍后会做讲解
    输出结果:

    2015-6-26 14:50:08 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
    信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7d26f75b: startup date [Fri Jun 26 14:50:08 CST 2015]; root of context hierarchy
    2015-6-26 14:50:08 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    信息: Loading XML bean definitions from class path resource [spring-ioc.xml]
    name : Json ; age : 25

    (二)构造注入就是指要被注入的类中声明一个构造方法,并在此方法的参数中定义要注入的对象。

    修改一下User类:

    package com.ioc;
    
    public class User {
    	private String name ;
    	private int age ;
    	public User(String name, int age) {  
           this.name = name;  
           this.age = age;  
        }  
    	public String printInfo(){
    		return "name : "+ name +" ; age : "+age; 
    	}
    }
    

     spring-ioc.xml配置

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"  
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
           xsi:schemaLocation="http://www.springframework.org/schema/beans  
               http://www.springframework.org/schema/beans/spring-beans-4.1.xsd">  
          
           <bean id="user" class="com.ioc.User">  
             <constructor-arg name="name" value="Json" />  
             <constructor-arg name="age" value="22" /> 
          </bean> 
    </beans>
    

     测试:

    package com.ioc;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class SpingTest {
    
        @Test
        public void test(){
            ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-ioc.xml") ;  
            User user = (User)context.getBean("user") ;  
            System.out.println(user.printInfo()) ;  
    
        }
    }
    

     结果:

    2015-6-26 15:05:53 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
    信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1342a80d: startup date [Fri Jun 26 15:05:53 CST 2015]; root of context hierarchy
    2015-6-26 15:05:53 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    信息: Loading XML bean definitions from class path resource [spring-ioc.xml]
    name : Json ; age : 22

     PS:Construcotrer注入和setter注入不同的XML写法方式

    constructor注入4种不同写法

    第1种方法:直接传值:

    <!-- constructor方式注入写法1,直接传值 --> 
    <bean id="user" class="com.ioc.User">  
           <constructor-arg value="Json" />  
           <constructor-arg value="22" /> 
    </bean>  

    ps:直接给参数赋值,这种方法也是根据顺序排的,所以一旦调换位置的话,就会出现bug,这种方法已经很原始了。 

    第2种方法:根据索引赋值,索引都是以0开头的:

    <!-- constructor方式注入写法2,根据索引赋值 -->
    <bean id="user" class="com.ioc.User">  
           <constructor-arg index="0" value="Json" />  
           <constructor-arg index="1" value="22" /> 
    </bean>  

    第3种方法:是根据所属类型传值:

     <!-- constructor方式注入写法3,根据所属类型传值 -->
    <bean id="user" class="com.ioc.User">  
           <constructor-arg type="String" value="Json" />  
           <constructor-arg type="int" value="22" /> 
    </bean> 

    ps:这种方法基本上不怎么适用,因为一个类里可以有好几个相同基本类型的变量,很容易就混淆值传给哪一个参数了所以最好不要使用这种方法。

    第4种方法:根据参数的名字传值:(推荐用法)

    <!-- constructor方式注入写法4,根据参数的名字传值:记得传入名是构造器的参数名(推荐用法) -->
    <bean id="user" class="com.ioc.User">  
           <constructor-arg name="name" value="Json" />  
           <constructor-arg name="age" value="22" /> 
    </bean> 

    setter注入3种不同写法

    <!-- setter方式注入写法1,记得要有无参构造函数 -->
    <bean id="user" class="com.ioc.User"> 
        <property name="name">
            <value>json</value>
        </property>
        <property name="age">
            <value>22</value>
        </property>
    </bean>
    <!-- setter方式注入写法2,记得要有无参构造函数 -->
    <bean id="user" class="com.ioc.User"> 
        <property name="name" value="Json" />
        <property name="age" value="22" />
    </bean>
    <!-- setter方式注入写法7,记得要有无参构造函数  -->
    <bean id="user" class="com.ioc.User"
        p:name="Json" p:age="22" />

    PS:推荐用第2种或第3种,第1种要写的代码比较多,看直来也没那么顺。

  • 相关阅读:
    任何时候都适用的20个C++技巧
    C++ 解析Json——jsoncpp(转)
    C++标准库和标准模板库(转)
    string标准C++中的的用法总结(转)
    JOIN US | 京东智联云诚聘技术精英
    在线公开课 | 云原生下的DevOps与持续交付
    AI端侧落地,京东AI技术如何部署边缘?
    CVPR 2020 | 京东AI研究院对视觉与语言的思考:从自洽、交互到共生
    IOT、AI、云计算等融合技术推进制造业产业转型
    边缘计算2.0时代,“云边缘”与“边缘云”你分清了吗?
  • 原文地址:https://www.cnblogs.com/JsonShare/p/4602308.html
Copyright © 2011-2022 走看看