Spring框架之(无参、有参)构造方法与setter方法的初始化
我们之前要创建对象时,都需要new
一下,但使用了Spring后,就不需要再new
了,可以直接使用类名调用了。这是因为Spring 已经为我们自动创建好了Java对象(但需要在xml文件里进行一些配置)。
举个例子看看吧:
一个bean就代表一个Java对象 ↑
public class Test {public static void main(String[] args) {/*之前需要创建一个date对象,需要自己new 一下*/Date date = new Date();System.out.println(date);/*但现在spring帮我们自动创建*/ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");/*如果<bean></bean>里没有用到id或name,则这样调用对象*/Date date = applicationContext.getBean(Date.class);/*如果<bean></bean>里用到id,则这样调用对象*/date = applicationContext.getBean(date);/*如果<bean></bean>里用到name(且有多个值时),则这样调用对象*/date = applicationContext.getBean(date);/*或者*/date = applicationContext.getBean(date2);System.out.println(date);applicationContext.close();//释放资源}
}
同时我们需要知道:
默认情况下,new ClassPathXmlApplicationContext("application.xml")
执行后,spring会自动调用类中的无参构造方法;
lazy-init="true"
很懒,不会随着new ClassPathXmlApplicationContext("application.xml")
的执行而创建对象,而是什么时候获取该对象,什么时候创建。
默认情况下,new ClassPathXmlApplicationContext("application.xml")
执行后,结果为:
即调用了无参构造方法!
但如果在<bean></bean>里添加lazy-init="true"
,即<bean></bean>变为:<bean class="com.jd.vo.Student" lazy-init="true"></bean>
,则只有调用该对象时,才创建对象,并调用无参构造方法。
那当构造方法中有参数,却又想调用构造方法,该怎么办呢?
1、构造方法中参数为基本数据类型或String类型:
public Student(int age,String name){System.out.println("student "+age+","+name);}
解决方法:<bean></bean>里用value属性赋值即可
<bean id="student" class="com.jd.vo.Student"><constructor-arg value="12"></constructor-arg><constructor-arg value="Jim"></constructor-arg></bean>
结果为:
student 12,Jim
2、构造方法中参数为类类型时:
public Student(Date date){System.out.println("student "+date);}
解决方法::<bean></bean>里需要用到 ref 属性
<bean id="student" class="com.jd.vo.Student"><!--ref用已存在的值--><constructor-arg ref="date2"></constructor-arg></bean>
结果为:
student Sun Oct 25 00:31:21 GMT+08:00 2020
3、构造方法中参数为List类型时:
public Student(List<String> names){for (String name:names) { //遍历 listSystem.out.println(name);}}
解决方法:<bean></bean>里需要用到 list 标签
<bean id="n" class="java.lang.String"><constructor-arg value="Jimmy"></constructor-arg></bean><bean class="com.jd.vo.Student"><constructor-arg><list><!--需要list标签--><!--然后list里是String类型的数据--><value>Tom</value> <!--则可以直接用value属性赋值--><bean class="java.lang.String"><!--还可以把String当作一个类,使用bean--><constructor-arg value="Lucy"></constructor-arg></bean><ref bean="n"></ref><!--那就同样可以使用ref属性了--></list></constructor-arg></bean>
结果是:
Tom
Lucy
Jimmy
4、构造方法中参数为数组(array)时:
public Student(int [] scores){for (int score:scores) {System.out.println(score);}}
解决方法:<bean></bean>里需要用到 array 标签
<bean id="score" class="java.lang.Integer"><constructor-arg value="600"></constructor-arg></bean><bean class="com.jd.vo.Student"><constructor-arg><array><!--需要用到array标签--><!--array里是int类型的数据--><value>606</value><!--所以可以用value属性赋值--><bean class="java.lang.Integer"><!--也可以把它看成一个类,使用bean--><constructor-arg value="604"></constructor-arg></bean><ref bean="score"></ref><!--既然是类,那同样可以使用 ref属性--></array></constructor-arg></bean>
结果:
606
604
600
5、构造方法中参数为Set集合时:
public Student(Set<String> addresses){for (String address:addresses){System.out.println(address);}}
解决方法:<bean></bean>里需要用到 set 标签
<bean id="address" class="java.lang.String"><constructor-arg value="深圳市"></constructor-arg></bean><bean class="com.jd.vo.Student"><constructor-arg><set><!--需要用到set标签--><!--set里是String类型的数据--><value>郑州市</value><bean class="java.lang.String"><constructor-arg value="北京市"></constructor-arg></bean><ref bean="address"></ref></set></constructor-arg></bean>
结果为:
郑州市
北京市
深圳市
6、构造方法中参数为map集合时:
public Student(Map<String,String> map){for (String key: map.keySet()){ //map集合里是set集合,遍历set集合System.out.println("key="+key+",value="+map.get(key));}}
解决方法:<bean></bean>里需要用到 map 标签
<bean id="k" class="java.lang.String"><constructor-arg value="lihua"></constructor-arg></bean><bean id="v" class="java.lang.String"><constructor-arg value="广东省深圳市"></constructor-arg></bean><bean class="com.jd.vo.Student"><constructor-arg><map><!--需要用到map标签--><!--map标签里是entry--><entry key="Jimmy" value="河南省郑州市"></entry><entry key-ref="k" value-ref="v"></entry></map></constructor-arg></bean>
结果为:
key=Jimmy,value=河南省郑州市
key=lihua,value=广东省深圳市
7、构造方法中参数为Properties时(也是key=value形式):
public Student(Properties properties){System.out.println(properties.getProperty("name"));System.out.println(properties.getProperty("mobile"));}
解决方法:<bean></bean>里需要用到 props 标签
<bean class="com.jd.vo.Student"><constructor-arg><props><prop key="name">lUCY</prop><prop key="mobile">110</prop></props></constructor-arg></bean>
结果为:
LUCY
110
那给setter方法如何赋值呢:
给setter方法赋值:
<!--为setter方法赋值:用property;上面是给构造方法赋值,所以用constructor-arg--><bean id="score" class="java.lang.Integer"><constructor-arg value="97"></constructor-arg></bean><bean id="name" class="java.lang.String"><constructor-arg value="Lucy"></constructor-arg></bean><bean class="com.jd.vo.Student"><!--给name赋值(String类型)--><property name="name" value="Tom"></property><!--给scores赋值(数组)--><property name="scores" ><array><value>99</value><bean class="java.lang.Integer"><constructor-arg value="98"></constructor-arg></bean><ref bean="score"></ref></array></property><!--给list赋值(list集合)--><property name="list"><list><value>Tom</value><bean class="java.lang.String"><constructor-arg value="Lucy"></constructor-arg></bean><ref bean="name"></ref></list></property></bean>
说白了,给setter方法赋值除了把<constructor-arg></constructor-arg>
换成<property></property>
,其他的和给有参构造方法的参数赋值如出一辙。
其实,给setter方法赋值除了上面的方法,还有一个更简便的方法:
<!--为setter方法赋值的简便表示方法--><!--util里只有set、list、map、properties,没有array(只能用上面的property)--><util:list id="li"><value>80</value><value>90</value></util:list><bean class="com.jd.vo.Student" p:name="Jimmy" p:list-ref="li"></bean>
注意:上面的<util></util>
里只有set、list、map、properties等,没有array,也就是说给数组(array)赋值只能用上面的那一种方法。
相关文章:

P1034 矩形覆盖
题目描述 在平面上有 n 个点(n < 50),每个点用一对整数坐标表示。例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2&a…

[linux][c语言]用socket实现简单的服务器客户端交互
Socket解释: 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。 Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP…

Spring之注解方式实例化Java类
我们知道一个<bean></bean>就代表一个对象,如果想创建多个对象,就要使用多个<bean></bean>,所以这里有个简便的方法: <context:component-scan base-package"com.jd"></context:comp…

3.Linux Shell流程控制
1.if/else结构 if condition thenstatements elif condition thenstatements elsestatements fi 2.条件 与C语言不同的是,条件(condition)实际上是语句列表,而不是一般的布尔表达式。 按照惯例,函数以及命令的退出状态用0表示成功,…

ASP.NET 2.0 中配合 Master Page 使用的优化 CSS 模型
ASP.NET 2.0 中增加了内建的 MasterPage 的支持,这对我们来说是一个很大的便利。然而经过一段时间的使用,我发现 MasterPage 并不是那么完美:嵌套的 MasterPage 不能支持设计时界面,以及下面要提到的Content Page 中增加 CSS 的问…

详细说明Spring--AOP
这篇博客较长,耐心读完或许会有“柳暗花明又一村”的感觉哦! 为什么? 我先不说AOP是什么,我先说说为什么要用AOP,依照惯例,我还是先举一个例子: 先把项目结构展现出来: 我们先在com.jd.calcu…

ES6中的Promise详解
Promise 在 JavaScript 中很早就有各种的开源实现,ES6 将其纳入了官方标准,提供了原生 api 支持,使用更加便捷。 定义 Promise 是一个对象,它用来标识 JavaScript 中异步操作的状态(pending, resolve, rejectÿ…

Jquery 将表单序列化为Json对象
大家知道Jquery中有serialize方法,可以将表单序列化为一个“&”连接的字符串,但却没有提供序列化为Json的方法。不过,我们可以写一个插件实现。 我在网上看到有人用替换的方法,先用serialize序列化后,将&替换成…

ASP.NET常用函数
Abs(number) 取得数值的绝对值。 Asc(String) 取得字符串表达式的第一个字符ASCII 码。 Atn(number) 取得一个角度的反正切值。 CallByName (object, procname, usecalltype,[args()]) 执行一个对象的方法、设定或传回对象的属性。 CBool(expression) 转换表达式为Boolean …

简单快速修改大量重复代码(Intellij IDEA)
血与泪的教训啊!!!刚开始不知道,一味地疯狂点鼠标和键盘,点到手抽筋才想起来百度一下如何快速修改大量重复代码,呜呜呜~~~ 给大家分享一下吧,可以节约大家大量的时间哦: …

5.3Role和Claims授权「深入浅出ASP.NET Core系列」
5.3Role和Claims授权「深入浅出ASP.NET Core系列」 原文:5.3Role和Claims授权「深入浅出ASP.NET Core系列」希望给你3-5分钟的碎片化学习,可能是坐地铁、等公交,积少成多,水滴石穿,码字辛苦,如果你吃了蛋觉得味道不错&…

電子商務新紀元-WebService With BizSnap
電子商務新紀元-WebService With BizSnap WebService SOAP(Simple Object Access Protocol) Web Services Description Language (WSDL) DELPHI 的SOAP 撰寫WebService Server 程式 撰寫Client 端程式 魔法的秘密 傳送複雜型態資料(Complex Type) 傳送檔案或圖形 處理資料庫 C…

mysql优化1
1.以空间换时间,减少连表查询的次数,适当增加冗余字段 例如: 计算的字段,可以事先统计完,方数据库中,来一个加一个,而不用现场计算 2.字段类型: 整型 > date,time >enum >char >varchar >blob,text 字符串需要考虑字符集和校对集,因此比整型慢 time会考虑时期,用…

用XP做服务器突破10人限制
用XP做服务器突破10人限制用微软提供的小工具 MetaEdit,最新版本是2.2。下载地址:http://download.microsoft.com/download/iis50/Utility/5.0/NT45/EN-US/MtaEdt22.exe安装好以后将树型目录展开至LM \ W3SVC直接在W3SVC文件夹上单击,选择右边列表中Name…

Java反射(详述版)
一、什么是反射? 我们先来看一个例子: package venus; public class Student {public String name;public Student(){System.out.println("无参构造方法");}public void doHomework(){System.out.println(name "正在做作业~~~");…

s9.16作业,员工信息表
转载https://blog.csdn.net/qq_35883464/article/details/83151464 实现员工信息表文件存储格式如下:id,name,age,phone,job1,Alex,22,13651054608,IT2,Egon,23,13304320533,Tearcher3,nezha,25,1333235322,IT 现在需要…

Dubbo+zookeeper使用方法以及注意事项
Dubbozookeeper使用方法以及注意事项最近在一个项目中想做一个数据库查询的服务,目的是将数据库查询这块从程序中脱离出来,形成一个公共的服务平台,大家都可以调用,经过考虑决定选用Dubbozookeeper这个经典的组合来实现࿰…

淘淘经受了一次考验...
18日去香港给一个潜在客户做了一次演示,顺便帮淘淘买了一罐奶粉,因为听说香港的奶粉质量比较好,是原装进口的。下午6点多回到深圳,没想到,听到一个不太好的消息。淘淘的奶奶推车带淘淘出去的时候,不小心&am…

使用MasterPage遇到的问题
最近重新拿起.NET,发现一切变的那么的陌生了,发展得真是快啊。。。在使用MasterPage时,要从一个页面的Form提交数据到另一个页面的Form,应该如何处理?不使用MasterPage的时候,可以直接使用PostBackUrl"…

Machine Learning——DAY1
监督学习:分类和回归 非监督学习:聚类和非聚类 1.分类和聚类的区别: 分类(Categorization or Classification)就是按照某种标准给对象贴标签(label),再根据标签来区分归类。 聚类是指事先没有“标签”而通过某种成团分析找出事物之…

Java的注解
一、注解的概念: 注解并不是一开始就有的,JDK5之前是没有注解的,JDK5及其以后JDK版本才开始支持Java注解! Java注解(Annotation)也叫做元数据,以注解名在代码中存在,它是一种在源代码…

activemq的学习,第一篇
本地的activemq的地址: http://localhost:8161/admin/ win10的启动avtivemq E:\Program Files\ActiveMQ\apache-activemq-5.15.3\bin\win64 win64里面的activemq.bat 消息队列的学习 学习地址2 这是spring集合activemq的地址:github pom.xml引入的依赖&a…

CS Tip 16: 利用注释
译自: http://soup.co.za/weblog/archive/2006/04/07/CS-Tip-16_3A00_-Commenting-out-controls.aspx 当您在修改皮肤时您可以修改任何HTML标记,但是除了带有runat"Server"的除外,删除掉将会产生错误 如果您不想某个控件显示在页面上您可以注释…

今天没有浪费时间,我努力了
7月12日经过暴雨洗礼过的清晨,我晚起了一会,我伧促的洗了把脸,瞪起朦胧胧的双眼,迈着疲惫步子,重复着这条凌乱的街道,10分钟多一点,我就到了公交站点,像往常一样,挤上了8…

动态规划——洛谷_P1057传球游戏
题目: 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球&…

多线程1(进程、[创建]线程与生命周期)
一、进程与线程 什么是进程?我们先说说什么是程序? 程序(Program)是为实现特定目标或解决特定问题而用计算机语言(比如Java、C等)编写的命令序列的集合。 进程(process)就是指一个程…

网络操作系统第四章
1. 磁盘的数据结构包括哪些内容? 答:分区,卷,磁盘分区,主分区,扩展分区,逻辑分区,逻辑驱动器,引导分区。 2. 什么是基本磁盘和动态磁盘? (…

广播风暴系列专题(一)广播风暴:发现-端口
近日防火墙经常地检测到"svchost UDP/连入192.168.1.255/137 192.168.1.66/137 1055656/1065732 UDP_WAIT 过滤 8:48:31 C:\WINDOWS\system32\svchost.exe";"services UDP/连出 192.168.1.21/137 192.168.1.255/137 920736/913476 UDP_WAIT 过滤 11:46:3…

显示一个顶层的提示信息
vb里常作,大概的思路就是显示一个顶层的窗体,提示暂时不要动。c#里更简单了MsgDlg msgnewMsgDlg(); msg.TopMosttrue; msg.Show(); System.Windows.Forms.Application.DoEvents();

ArcGIS Engine开发-TOCControl中实现图层的拖放
TOCControl非常好,不用写一行代码就可以将整个地图的图层信息况显示出来;TOCControl也非常坏,提供的接口非常少,我认为有用的只有三个:HitTest,SetBuddyControl,Update,而且Update方法一执行,整…