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种要写的代码比较多,看直来也没那么顺。

原文地址:https://www.cnblogs.com/JsonShare/p/4602308.html