Spring学习(3)---Spring设值注入和构造注入

时间:2023-03-09 01:30:48
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种要写的代码比较多,看直来也没那么顺。