我们之前要创建对象时,都需要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)赋值只能用上面的那一种方法。

Spring框架之(无参、有参)构造方法与setter方法的初始化相关推荐

  1. Spring中bean属性注入方式总结:构造方法、setter注入、p命令空间注入、SpEL注入、集合注入

    1. 构造方法注入 constructor-arg用于配置构造方法一个参数 name :参数的名称 value:设置普通数据 ref:引用数据,一般是另一个bean id值 index :参数的索引号 ...

  2. Java中详述构造方法与setter方法

    1.基本数据类型和String类型 基本数据类型和String类型,使用value标签属性进行调用 application.xml文件中代码展示: <!--基本数据类型和String类型--&g ...

  3. spring学习12 -Spring 框架模块以及面试常见问题注解等

    以下为spring常见面试问题: 1.Spring 框架中都用到了哪些设计模式? Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的: 代理模式-在AOP和remoting中被用的比较 ...

  4. 25道Spring框架面试题

    25个经典的Spring面试问答 By - Last updated: 星期二, 五月 5, 2015 本人收集了一些在大家在面试时被经常问及的关于Spring的主要问题,这些问题有可能在你下次面试时 ...

  5. Spring框架文档(二 )

    @[TOC](文章目录) 原文英文链接: https://docs.spring.io/spring/docs/5.2.3.BUILD-SNAPSHOT/spring-framework-refere ...

  6. Spring框架面试精华知识

    咳咳,这里整理一些关于WEB框架的一些知识点,来帮助更多的人进行面试,主要的还是讲解一些关于目前企业用得比较流行的框架,还有就是一些比较前沿的框架,比如阿里开源的Dubbo框架及其开源框架Zookee ...

  7. spring框架之面试

    spring框架之面试 Spring的主要问题,这些问题有可能在你下次面试时就会被问到.对于本文中未提及的Spring其他模块,我会单独分享面试的问题和答案. 欢迎大家向我推荐你在面试过程中遇到关于S ...

  8. spring框架 基础 与他方问

    Spring框架-控制反转(IOC) 1 Spring框架概述 1.1 什么是Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Jo ...

  9. Spring框架介绍及使用(转载)

    原文链接 Spring框架-控制反转(IOC) 1 Spring框架概述 1.1 什么是Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由R ...

最新文章

  1. 比特币现金压力测试超越了24小时创造新纪录
  2. python inspect模块
  3. 网络:TCP粘包问题?如何解决?
  4. 20210625 函数的极限
  5. k8s 给worker/master节点打标签(角色标签)
  6. 关于C3P0容错和自动重连特性的研究
  7. spring jms 消息_Spring JMS,消息自动转换,JMS模板
  8. 10个绕过反病毒的恶意用户技巧
  9. Security+ 学习笔记1 恶意软件
  10. 一文看懂BGP路由黑洞问题
  11. C++ GUID和string转化函数【转载】
  12. 《赖氏经典英语语法》第六集
  13. 最性感的肩膀纹身设计女装 - 5令人惊叹的设计,你会爱!
  14. 【原创】超级详细的iPhone铃声制作、导入、设置全过程教程
  15. Kotlin第三章:AndroidUI简介
  16. cobar是什么? 能做什么?
  17. 重载和重写的区别???
  18. 抖音赛道是啥?有什么逻辑?
  19. gvim 字体(font)+风格(style)+ 大小(size)设置
  20. 3_树莓派机载计算机的硬件资源样例教程——无名创新

热门文章

  1. Linux文件系统:概览(思维导图)
  2. 在一台电脑上使用两个github账号
  3. 转:[大数据竞赛]夺冠感言:走进业务,提升对世界的认知能力
  4. static关键字用法
  5. Ubuntu 16.04安装QQ(不一定成功)
  6. Hadoop 生态系统
  7. ntohs的一个简单实现(将网络流中用两个字节16进制表示的资源数(如DNS)和长度转换为整形)...
  8. HTTP referer
  9. Asp.Net 使用 GDI+ 绘制3D饼图入门篇源码
  10. PE文件和COFF文件格式分析——RVA和RA相互计算