第五章第二节-spring注入属性

本文详细介绍了Spring框架中Bean的构造器注入和属性注入的多种方式,包括使用name、type、index属性进行精确匹配,以及特殊字符的正确注入方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、标准的Bean配置

  在spring的HelloWorld中配置过一个Person的Bean,我们通过bean标签和它的class、id属性就可以配置一个标准的bean了,代码如下。至于其他的配置下面将逐一介绍,这里就不再做过的说明。

<bean id="person" class="com.escore.beans.Person"></bean>

二、spring XML命名空间的说明

 

    这里不再展开讨论每个具体的作用,在后面那里用到了那里介绍。

 

命名空间

作用说明

beans

支持声明bean,装配bean。Spring核心的命名空间

aop

为切面编程提供的各类xml配置

context

为Spring应用上下文提供的配置元素,如自动扫描

jdbc

为spring的jdbc提供的配置元素

jee

提供了与Java EE的继承,如jndi、ejb

lang

支持配置由Groovy、JRuby等脚本实现的Bean

p

提供便捷的装配Bean的方式

task

为任务调度器提供的配置元素

tx

提供声明式事务配置

util

提供的各种工具配置元素,如配置一个集合bean

三、构造器注入  

 

    我们先按照HelloWorld的方式建立一个java项目。主要涉及Person类、MainTest类和spring.xml配置文件。代码见下面的代码片段。

    首先对Person类做一个简单的介绍,它是一本标准的Bean类,除了属性个属性对应的getter、setter方法外,还有四个重载的构造器方法,目的是为了测试构造器注入的一些问题。toString方法为了方便控制台查看,那个空参数的构造器是必须要写的,应为spring的容器需要使用。

    第二个就是MainTest类,和HelloWorld测试类一样为了测试配置的不同bean,只要在getBean方法中更改id即可。

    第三个是spring.xml配置文件,配置了构造器注入和属性注入的各种方式。

 

    现在看第一个构造器配置。使用constructor-arg标签来进行构造器的注入,name表示构造器中对应的形参,value表示要注入的值。<value></value>子标签与value属性效果一样,但是如果有些值是特殊的格式,例如“<”要注入必须使用<!-[CDTATA[你要输入的值]]>的方式注入以避免冲突。这种用法必须要放入到value子标签才可以,value属性是不支持的。 实际上这里还有一个问题,那就是name表示的形参是不能方面签名的条件,也就是说如果是重载的构造器而且重载构造器的形式参数也一样,那么这种做法是无法判断你想用的是那一个构造器。

 

<bean id="person" class="com.escore.beans.Person">
		<constructor-arg name="name" value="Tom"></constructor-arg>
		<constructor-arg name="age" value="168"></constructor-arg>
		<constructor-arg name="address">
			<value><![CDATA[<ChangSha·湘江街道>]]></value>
		</constructor-arg>
	</bean>

    先不管这个问题如何解决来看下面这个构造器注入的方式。还是需要使用constructor-arg标签和value,不再用name属性而是用type。type表示属性的类型。但是靠这种方式也是不行,我们可以用测试类来测试一下person2,因为我的Person类重载的三个有参构造器,其中有两个构造器都有两个String类型参数和一个int参数,导致无法准决判断用那个注入。

 

<bean id="person2" class="com.escore.beans.Person">
		<constructor-arg value="Tom" type="String"></constructor-arg>
		<constructor-arg value="168" type="int"></constructor-arg>
		<constructor-arg type="String">
			<value><![CDATA[<ChangSha·湘江街道>]]></value>
		</constructor-arg>
	</bean>

    再来看一下index属性的方式来构造注入,它的问题与只用type的类似,也是无法确定构造器。

 

 

<bean id="person3" class="com.escore.beans.Person">
		<constructor-arg value="Tom" index="0"></constructor-arg>
		<constructor-arg value="8" index="2"></constructor-arg>
		<constructor-arg index="1">
			<value><![CDATA[<ChangSha·湘江街道>]]></value>
		</constructor-arg>
	</bean>

    既然前面三个方式都有问题,那么怎么做才可行。下面的这种构造器注入才是可行的。结合type和index,当然构造的参数个数也必须匹配,这样就可以完全匹配唯一的构造器。其实上面这些问题的造成就是方法签名的问题(不清楚的可以查一下java方面签名的资料)。

 

 

<bean id="person4" class="com.escore.beans.Person">
		<constructor-arg value="Tom" index="0" type="String"></constructor-arg>
		<constructor-arg value="8" index="2" type="int"></constructor-arg>
		<constructor-arg index="1" type="String">
			<value><![CDATA[<ChangSha·湘江街道>]]></value>
		</constructor-arg>
	</bean>

四、属性注入

 

    根据下面的代码片段,属性注入就是采用property标签加上name和alue将值注入到制定的对应的属性中即可。value的使用和constructor-arg的一样。值得注意的是,这里的name属性并不是指的类的成员变量的名称,而是setter风格的名称。例如setAddress()就是address。

 

<bean id="person5" class="com.escore.beans.Person">
	 	<property name="name" value="Jerry"></property>
	 	<property name="address">
	 		<value><![CDATA[!BeiJing>]]></value>
	 	</property>
	 </bean>

 

Person类的全部代码

 

public class Person {

	private String name;
	private int age;
	private String address;
	private float stature;
	private int weight;

	public Person() {
	}

	public Person(String name, String address, int age) {
		super();
		this.name = name;
		this.age = age;
		this.address = address;
	}

	public Person(String name, int weight, String address) {
		super();
		this.name = name;
		this.weight = weight;
		this.address = address;
	}

	public Person(String name, String address, float stature) {
		super();
		this.name = name;
		this.address = address;
		this.stature = stature;
	}

	public int getWeight() {
		return weight;
	}

	public void setWeight(int weight) {
		this.weight = weight;
	}

	public float getStature() {
		return stature;
	}

	public void setStature(float stature) {
		this.stature = stature;
	}

	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 getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", address=" + address + ", stature=" + stature + ", weight="
				+ weight + "]";
	}

}

MainTest类的全部代码

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.escore.beans.Person;

public class MainTest {
	
	public static void main(String[] args) {
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
		
		Person person = (Person) ctx.getBean("person5");
		
		System.out.println(person);
		
		ctx.close();
		
	}

}

spring.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.xsd">

	<bean id="person" class="com.escore.beans.Person">
		<constructor-arg name="name" value="Tom"></constructor-arg>
		<constructor-arg name="age" value="168"></constructor-arg>
		<constructor-arg name="address">
			<value><![CDATA[<ChangSha·湘江街道>]]></value>
		</constructor-arg>
	</bean>
	
	<bean id="person2" class="com.escore.beans.Person">
		<constructor-arg value="Tom" type="String"></constructor-arg>
		<constructor-arg value="168" type="int"></constructor-arg>
		<constructor-arg type="String">
			<value><![CDATA[<ChangSha·湘江街道>]]></value>
		</constructor-arg>
	</bean>
	
	<bean id="person3" class="com.escore.beans.Person">
		<constructor-arg value="Tom" index="0"></constructor-arg>
		<constructor-arg value="8" index="2"></constructor-arg>
		<constructor-arg index="1">
			<value><![CDATA[<ChangSha·湘江街道>]]></value>
		</constructor-arg>
	</bean>
	<!-- 推荐使用的构造器注入属性方式 -->
	<bean id="person4" class="com.escore.beans.Person">
		<constructor-arg value="Tom" index="0" type="String"></constructor-arg>
		<constructor-arg value="8" index="2" type="int"></constructor-arg>
		<constructor-arg index="1" type="String">
			<value><![CDATA[<ChangSha·湘江街道>]]></value>
		</constructor-arg>
	</bean>
	
	<!--*****************属性注入方法*************************-->
	 <bean id="person5" class="com.escore.beans.Person">
	 	<property name="name" value="Jerry"></property>
	 	<property name="address">
	 		<value><![CDATA[!BeiJing>]]></value>
	 	</property>
	 </bean>

</beans>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值