Spring基础学习—注入参数详解
Posted ✈✈✈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring基础学习—注入参数详解相关的知识,希望对你有一定的参考价值。
在Spring配置文件中,用户不但可以将String、int等字面值注入Bean中,还可以将集合、Map等类型注入Bean中,此外还可以注入配置文件中其他定义的Bean。
一、字面值
(1)可用字符串表示的值,可以通过<value>元素标签或value属性进行注入。
(2)基本数据类型及其封装类、Stting类型都可以采用字面值注入的方式。
(3)若字面值包含特殊字符,可以使用<![CDATA[]]>把字面值包裹起来。
<bean id="car" class="com.kiwi.domain.Car"> <property name="brand" > <value><![CDATA[BMW&x5]]></value> </property> <property name="color" value="Black"/> <property name="price" value="800000"/> <property name="maxSpeed" value="200"/> </bean>
由于brand属性包含了一个XML的特殊符号,因此特意在属性值外添加一个XML特殊处理标签<![CDATA[]]>,这个标签的作用就是让XML解析器将标签中的字符串当作普通文本对待,以防止某些字符对XML格式造成破坏。
二、引用其他Bean
(1)要使Bean能相互访问,就必须在Bean的配置文件中指定对Bean的引用。
(2)在Bean的配置文件中,可以通过<ref>属性或元素配置。
(3)也可以在属性内部包含Bean的声明,这样的Bean称为内部Bean。
(4)内部Bean不能被外部使用。
Person.java
public class Person{ private String name; private int age; private Car car; @Override public String toString(){ return "Person [name=" + name + ", age=" + age + ", car=" + car + "]"; } //省略get set... }
applicationContext.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="car" class="com.kiwi.domain.Car"> <property name="brand" value="BMW"/> <property name="color" value="Black"/> <property name="price" value="800000"/> <property name="maxSpeed" value="200"/> </bean> <bean id="person" class="com.kiwi.domain.Person"> <property name="name" value="Tom"/> <property name="age" value="26"/> <!-- 使用ref属性建立bean之间的引用关系 --> <property name="car" ref="car"/> </bean> </beans>
Test.java
@Test public void testCar(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Person person = (Person)context.getBean("person"); System.out.println(person); }
结果:
Person [name=Tom, age=26, car=Car [brand=BMW, color=Black, price=800000.0, maxSpeed=200]]
如果不引用外部的Bean,可以在内部声明一个内部Bean,这个内部Bean不能被其他外部Bean引用。
<?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="car" class="com.kiwi.domain.Car"> <property name="brand" value="BMW" /> <property name="color" value="Black" /> <property name="price" value="800000" /> <property name="maxSpeed" value="200" /> </bean> <bean id="person" class="com.kiwi.domain.Person"> <property name="name" value="Tom" /> <property name="age" value="26" /> <!-- 定义一个内部bean,内部bean外面不能引用 --> <property name="car"> <bean class="com.kiwi.domain.Car"> <property name="brand" value="Audi" /> <property name="color" value="Black" /> <property name="price" value="300000" /> <property name="maxSpeed" value="250" /> </bean> </property> </bean> </beans>
结果:
Person [name=Tom, age=26, car=Car [brand=Audi, color=Black, price=300000.0, maxSpeed=250]]
也可以为级联属性赋值。
<?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="car" class="com.kiwi.domain.Car"> <property name="brand" value="BMW" /> <property name="color" value="Black" /> <property name="price" value="800000" /> <property name="maxSpeed" value="200" /> </bean> <bean id="person" class="com.kiwi.domain.Person"> <property name="name" value="Tom" /> <property name="age" value="26" /> <property name="car" ref="car"/> <!-- 为级联属性赋值,前提是属性先初始化然后才可以为其级联属性赋值 --> <property name="car.maxSpeed" value="250"/> </bean> </beans>
结果:
Person [name=Tom, age=26, car=Car [brand=BMW, color=Black, price=800000.0, maxSpeed=250]]
三、集合属性
1.List和Set
(1)配置List需要指定<list>标签,标签里包含一些元素,这些元素可以通过<value>指定简单的常量值,也可以使用<ref>指定对其他Bean的引用。
(2)配置set需要使用<set>标签,其他属性和List一样。
Person.java
public class Person{ private String name; private int age; private List<Car> cars; //省略get set... }
applicationContext.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="car" class="com.kiwi.domain.Car"> <property name="brand" value="BMW" /> <property name="color" value="Black" /> <property name="price" value="800000" /> <property name="maxSpeed" value="300" /> </bean> <bean id="car2" class="com.kiwi.domain.Car"> <property name="brand" value="Audi" /> <property name="color" value="Black" /> <property name="price" value="400000" /> <property name="maxSpeed" value="250" /> </bean> <bean id="person" class="com.kiwi.domain.Person"> <property name="name" value="Tom" /> <property name="age" value="26" /> <!-- 配置集合属性List --> <property name="cars"> <list> <ref bean="car"/> <ref bean="car2"/> </list> </property> </bean> </beans>
结果:
Person [name=Tom, age=26, cars=[Car [brand=BMW, color=Black, price=800000.0, maxSpeed=300], Car [brand=Audi, color=Black, price=400000.0, maxSpeed=250]]]
2.Map
(1)通过<map>标签定义,子标签使用<entry>标签。
(2)在<entry>标签里可以使用key、key-ref、value、value-ref属性。
Person.java
public class Person{ private String name; private int age; private Map<String,Car> cars; //省略get set... }
applicationContext.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="car" class="com.kiwi.domain.Car"> <property name="brand" value="BMW" /> <property name="color" value="Black" /> <property name="price" value="800000" /> <property name="maxSpeed" value="300" /> </bean> <bean id="car2" class="com.kiwi.domain.Car"> <property name="brand" value="Audi" /> <property name="color" value="Black" /> <property name="price" value="400000" /> <property name="maxSpeed" value="250" /> </bean> <bean id="person" class="com.kiwi.domain.Person"> <property name="name" value="Tom" /> <property name="age" value="26" /> <!-- 配置集合属性Map --> <property name="cars"> <map> <entry key="1" value-ref="car"/> <entry key="2" value-ref="car2"/> </map> </property> </bean> </beans>
结果:
Person [name=Tom, age=26, cars={1=Car [brand=BMW, color=Black, price=800000.0, maxSpeed=300], 2=Car [brand=Audi, color=Black, price=400000.0, maxSpeed=250]}]
3.Properties
Properties类型可以看作Map类型的特例,Map元素的键和值可以是任何类型的对象,而Properties的键和值只能是字符串。
Boss.java
public class Boss{ private Properties mails; @Override public String toString(){ return "Boss [mails=" + mails + "]"; } public Properties getMails(){ return mails; } public void setMails(Properties mails){ this.mails = mails; } }applicationContext.xml
<bean name="boss" class="com.kiwi.domain.Boss"> <property name="mails"> <props> <prop key="jobMail">[email protected]</prop> <prop key="lifeMail">[email protected]</prop> </props> </property> </bean>
结果:
Boss [mails={[email protected], [email protected]}]
4.配置集合类型的Bean
(1)使用基本集合标签定义集合时,不能将集合作为独立的Bean定义,导致其他Bean无法引用该集合,所以无法在不同Bean直接共享集合。
(2)如果希望配置一个集合类型的Bean,而非一个集合类型的属性,则可以通过util命名空间进行配置。
(3)必须先引用util命名空间才能使用。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <bean id="car" class="com.kiwi.domain.Car"> <property name="brand" value="BMW" /> <property name="color" value="Black" /> <property name="price" value="800000" /> <property name="maxSpeed" value="300" /> </bean> <bean id="car2" class="com.kiwi.domain.Car"> <property name="brand" value="Audi" /> <property name="color" value="Black" /> <property name="price" value="400000" /> <property name="maxSpeed" value="250" /> </bean> <!-- 定义一个公共的Map其他Bean能够直接引用它 --> <util:map id="cars"> <entry key="1" value-ref="car"/> <entry key="2" value-ref="car2"/> </util:map> <bean id="person" class="com.kiwi.domain.Person"> <property name="name" value="Tom" /> <property name="age" value="26" /> <!-- 引用公共的Map --> <property name="cars" ref="cars"/> </bean> </beans>
以上是关于Spring基础学习—注入参数详解的主要内容,如果未能解决你的问题,请参考以下文章
spring使用DataSoure注入参数时报No supported DataSource type found
JAVA框架--hibernatestruts2spring