Spring4学习回顾之路04—引用其他Bean,集合数据注入,内部Bean
引用其他Bean
组件应用程序的Bean经常需要相互协作以完成应用程序的功能,所以要求Bean能够相互访问,就必须在Bean配置文件中指定Bean的引用。在Bean的配置文件中可以用过<ref>元素或者ref属性为Bean的属性或构造器参数指定对Bean的引用。也可以在属性或者构造器里包含Bean的声明,这样的Bean称为内部Bean。具体看代码,在之前的Student类上新增Book类,(一个学生有一本书)。代码如下:
Book.java
package com.lql.spring01; /**
* @author: lql
* @date: 2019.10.11
* Description:
* Created with IntelliJ IDEA
*/
public class Book { private String name; private double price; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public double getPrice() {
return price;
} public void setPrice(double price) {
this.price = price;
}
}
Student.java
package com.lql.spring01;/**
* @author: lql
* @date: 2019.09.24
* Description:
*/
public class Student { private String name; private Integer age; private Book book; public Book getBook() {
return book;
} public void setBook(Book book) {
this.book = book;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
}
}
然后在applicationContext.xml的配置文件中配置Book类的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:标识 class:类路径 name:属性名,注意是针对set方法的属性名,不是变量的属性名 value:属性值 -->
<bean id="student" class="com.lql.spring01.Student">
<property name="name" value="lql"></property>
<property name="age" value="18"></property>
<property name="book" ref="book"></property>
<!--<property name="book">
<ref bean="book"></ref>
</property>-->
</bean> <bean id="book" class="com.lql.spring01.Book">
<property name="name" value="三国演义"></property>
<property name="price" value="79.9"></property>
</bean>
</beans>
代码中就是使用<ref>元素或者ref属性来引用的示例,测试是没问题的:
public void Hello() { System.out.println("Hello :" + this.getName() + ",Book:" + this.book.getName());
} public static void main(String[] args) {//创建IOC容器
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取bean
Student student = app.getBean("student", Student.class);
//调用方法
student.Hello();
} //输出:Hello :lql,Book:三国演义
内部Bean
当Bean的实例仅仅给一个特定的属性使用时,可以将其声明为内部Bean,内部Bean声明直接包含<property>或<constructor-arg>元素里,不需要设置任何的id或name属性,内部Bean不能使用在任何其他地方。
实际很简单,配置更改如下:
<bean id="student" class="com.lql.spring01.Student">
<property name="name" value="lql"></property>
<property name="age" value="18"></property>
<!--内部bean-->
<property name="book">
<bean class="com.lql.spring01.Book">
<property name="price" value="100.0"></property>
<property name="name" value="时间简史"></property>
</bean>
</property>
</bean>
测试也是没问题的,这里省略打印。
NULL值和级联属性
可以使用专用的<null/>元素标签为Bean的字符串或其它对象类型的属性注入null值(意义不大,了解知道有这么回事就行了),当然Spring也支持级联属性的配置。
<?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:标识 class:类路径 name:属性名,注意是针对set方法的属性名,不是变量的属性名 value:属性值 -->
<bean id="student" class="com.lql.spring01.Student">
<property name="name" value="lql"></property>
<property name="age" value="18"></property>
<property name="book">
<null/>
</property>
</bean>
<bean id="book" class="com.lql.spring01.Book">
<property name="name" value="三国演义"></property>
<property name="price" value="79.9"></property>
</bean>
</bean>
这样一来,book的引用就是null。级联属性的代码如下:
<?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:标识 class:类路径 name:属性名,注意是针对set方法的属性名,不是变量的属性名 value:属性值 -->
<bean id="student" class="com.lql.spring01.Student">
<property name="name" value="lql"></property>
<property name="age" value="18"></property>
<property name="book" ref="book"></property>
<property name="book.price" value="19.9"></property>
<property name="book.name" value="java从入门到放弃"></property>
</bean>
<bean id="book" class="com.lql.spring01.Book">
<property name="name" value="三国演义"></property>
<property name="price" value="79.9"></property>
</bean>
</bean>
打印结果为:Hello :lql,Book:java从入门到放弃,而非三国演义了。需要注意的是一定要提供setter()。并且我先给book赋值的后调级联属性的,<property name="book" ref="book"></property>,如果没有先引用直接使用级联属性可行不可行呢?答案是否定的,在Struts2里面是支持的,但是Spring是不支持。它会报:Value of nested property 'book' is null。(但是很多情况下也用不到级联属性,知道了解就行了)。
集合属性
在Spring中可以通过一组内置的xml标签来配置集合属性(例如:<list>,<set>,<map>等),配置java.util.List类型的属性,需要指定<list>标签,内部可以使用<value>指定简单的常量值,也可以通过<ref>指定对其他Bean的引用,通过<null/>指定空元素,甚至可以内嵌其他集合。当然,数组也可以使用<list>,<array>。代码如下:先建ListDemo类
package com.lql.spring01; import java.util.List; /**
* @author: lql
* @date: 2019.10.11
* Description:
* Created with IntelliJ IDEA
*/
public class ListDemo { private List<String> list; public void setList(List<String> list) {
this.list = list;
} public List<String> getList() {
return list;
}
}
配置文件如下:需要为ListDemo.java的list属性赋值
<?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="list" class="com.lql.spring01.ListDemo">
<property name="list">
<list value-type="java.lang.String">
<value>红色</value>
<value>白色</value>
<value>黑色</value>
<value>还原色</value>
</list>
</property>
</bean>
</bean>
测试代码和结果:
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationcontext.xml");
ListDemo list = app.getBean("list", ListDemo.class);
list.getList().forEach(System.out::println);
} //结果: 红色 白色 黑色 还原色
java.util.Set需要使用<set>标签,定义方式与List一样。这里略,(set不允许重复)
java.util.map通过<map>标签定义,<map>标签里可以使用多个<entry>作为子标签,每个条目包含一个键和一个值,需要注意几点:
①:必须在<key>标签里面定义key.
②:因为键和值的类型没有限制,所以可以自由地为它们指定<value>,<ref>,<bean>,<null>元素。
③:可以将Map的键和值作为<entry>的属性定义。简单常量使用key和value定义,Bean引用通过key-ref和value-ref属性定义
④:使用<props>定义java.util.properties,(properties是hashtable的子类)该标签使用多个<prop>作为子标签,每个<prop>标签必须定义key属性。
代码如下,简单的形式定义:
<?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="list" class="com.lql.spring01.ListDemo">
<property name="list">
<list value-type="java.lang.String">
<value>红色</value>
<value>白色</value>
<value>黑色</value>
<value>还原色</value>
</list>
</property> <property name="set">
<set value-type="java.lang.Integer">
<value>1</value>
<value>2</value>
<value>3</value>
<value>4</value>
<value>5</value>
<value>3</value>
</set>
</property> <property name="map">
<map>
<entry key="壹">
<value>1</value>
</entry>
<entry key="贰">
<value>2</value>
</entry>
</map>
</property>
</bean>
</beans>
测试结果是可行的:
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationcontext.xml");
ListDemo list = app.getBean("list", ListDemo.class); //list
list.getList().forEach(System.out::println);
System.out.println("===================="); //set
list.getSet().forEach(System.out::println);
System.out.println("===================="); //map
Map<String, Integer> map = list.getMap();
map.forEach((x,y)-> System.out.println(x + "====" + y)); }
//输出:壹====1,贰====2
接下来试试properties类:
先定义一个PropertiesDemo.java
package com.lql.spring01; import java.util.Properties; /**
* @author: lql
* @date: 2019.10.11
* Description:
* Created with IntelliJ IDEA
*/
public class PropertiesDemo { private Properties properties; public void setProperties(Properties properties) {
this.properties = properties;
} public Properties getProperties() {
return properties;
}
}
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="properties" class="com.lql.spring01.PropertiesDemo"> <property name="properties">
<props>
<prop key="壹">1</prop>
<prop key="贰">2</prop>
<prop key="叁">3</prop>
</props>
</property>
</bean>
</bean>
测试代码和结果如下:
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); PropertiesDemo properties = app.getBean("properties", PropertiesDemo.class); properties.getProperties().forEach((x,y) -> System.out.println(x + "==" + y));
} //结果:叁==3 壹==1 贰==2
配置单独集合Bean,以供引用
拿之前的List来说,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"
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"> <util:list id="reList">
<value>红色</value>
<value>黄色</value>
<value>黑色</value>
<value>还原色</value>
</util:list>
<bean id="list" class="com.lql.spring01.ListDemo">
<property name="list" ref="reList"></property>
</bean>
</bean>
需要注意的是引入util头,上图已经加粗显示。测试还是没有问题的:
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationcontext.xml");
ListDemo list = app.getBean("list", ListDemo.class);
list.getList().forEach(System.out::println);
}
//结果 红色 黄色 黑色 还原色
P命名空间
同样,先引入P的头。加粗
<?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"
xmlns:P="http://www.springframework.org/schema/p"
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="stu" class="com.lql.spring01.Student" P:name="张四" P:age="18" P:book-ref="book"></bean>
</bean>
测试结果:Hello :张四,Book:java从入门到放弃。
Spring4学习回顾之路04—引用其他Bean,集合数据注入,内部Bean的更多相关文章
- Spring4学习回顾之路06- IOC容器中Bean的生命周期方法
SpringIOC容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行特定的任务! Spring IOC容器对Bean的生命周期进行管理的过程: -通过构造器或者工厂方法创建 ...
- Spring4学习回顾之路01—HelloWorld
以前公司一直使用的是spring3.0,最近一段时间开始用了4.0,官网上都已经有了5.0,但是很多知识点已经忘了差不多了,趁现在项目不忙写写随笔,一来回顾自己的知识点,二来如果能帮助比我还小白的小白 ...
- Spring4学习回顾之路11-AOP
Srping的核心除了之前讲到的IOC/DI之外,还有一个AOP(Aspect Oriented Programming:面向切面编程):通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术 ...
- Spring4学习回顾之路10-Spring4.x新特性:泛型依赖注入
泛型依赖注入:Spring 4.x中可以为子类注入子类对应的泛型类型的成员变量的引用. 话语太过抽象,直接看代码案例,依次建立如下代码: User.java package com.lql.sprin ...
- Spring4学习回顾之路07- 通过工厂方法配置Bean
一:通过静态工厂配置Bean 建立Student.java package com.lql.srping04; /** * @author: lql * @date: 2019.10.28 * Des ...
- Spring4学习回顾之路03—XML配置Bean ,依赖注入的方式
配置Bean的形式可以基于XML文件的方式,也可以基于注解的方式,而Bean的配置方式可以通过全类名(反射),通过工厂方式和FactoryBean. XML形式 <?xml version=&q ...
- Spring4学习回顾之路12-事务
事务:事务就是一系列的动作,它们被当做一个单独的工作单元,这些动作要么全部完成,要么全部不起作用:事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性.事务的四个关键属性(ACI ...
- Spring4学习回顾之路09-基于注解的方式配置bean
一:基于注解配置Bean 首先介绍下组件扫描(component scanning): Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 包括: -@Component ...
- Spring4学习回顾之路08- FactoryBean配置Bean
建立Student.java package com.lql.srping04; /** * @author: lql * @date: 2019.10.28 * Description: */ pu ...
随机推荐
- mac使用brew安装mysql报RROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
使用mac安装mysql安装完后运行 mysql -uroot -p 报了 ERROR 2002 (HY000): Can't connect to local MySQL server throug ...
- 如何利用新浪官方的短网址API接口实现T.cn短链接的压缩生成
短网址的实现原理就是有一个数据表会配置文件将短网址和实际网址进行对应,当请求某个短网址时,程序跳转到对应的实际网址上去,从而实现网址的访问.目前国内最稳定最好用的是新浪T.cn短链接. 之前新浪提供了 ...
- AcWing:176. 装满的油箱(bfs + dijiskla思想)
有N个城市(编号0.1…N-1)和M条道路,构成一张无向图. 在每个城市里边都有一个加油站,不同的加油站的单位油价不一样. 现在你需要回答不超过100个问题,在每个问题中,请计算出一架油箱容量为C的车 ...
- Elasticsearch学习笔记-Delete By Query API
记录关于Elasticsearch的文档删除API的学习 首先官网上Document APIs介绍了 Delete API 和Delete By Query API. Delete API可以通过指定 ...
- linux中wget未找到命令
(转)linux中wget未找到命令 转:https://blog.csdn.net/djj_alice/article/details/80407769 在装数据库的时候发现无法使用wget命令 ...
- 【互联网运营P1】
一.导论 [运营]是什么 二.运营的职业分工和职能发展 三.转化型文案 4个高转化率短文案的常见姿势 2个短文案写作的核心要则 中长型转化文案的写作 针对所有问题点依次进行详细解读 四.第三方推广 常 ...
- FullSync不支持中文文件名
FullSync,能实现多种方式.协议的目录同步软件,但不支持中文文件名.
- 一百零五:CMS系统之flask-mail使用和邮箱配置、发送邮件功能
安装:pip install flask-mail 官方文档:https://pythonhosted.org/Flask-Mail/ 邮箱配置 MAIL_SERVER = 'smtp.qq.com' ...
- #dokcer部署code-server web版vscode+golang
codercom/code-server:latest不支持插件在线安装 codercom/code-server:v2目前为最新版1. #创建 docker rm -f vscode docker ...
- 【经验】Delphi INI文件保存与读取
//需要引用IniFiles uses system.IniFiles; //保存INI配置文件 procedure TForm1.btnSaveClick(Sender: TObject); var ...