一篇文带你入门SSM框架Spring开发,帮你快速拿Offer

程序员夏亚 2021-08-08 22:09:44
java 后端 程序员


在IOC容器中配置bean的方法也有固定的格式,spring中规定在容器中添加的bean属性需要写在<bean></bean>中,并指明该bean的id和类路径,如下:


<!-- 使用bean元素定义一个由IOC容器创建的对象 -->
<!-- class属性指定用于创建bean的全类名 -->
<!-- id属性指定用于引用bean实例的标识 -->
<bean?id="student"?class="com.atguigu.helloworld.bean.Student">
<!-- 使用property子元素为bean的属性赋值 -->
<property?name="studentId"?value="1001"/>
<property?name="stuName"?value="Tom2015"/>
<property?name="age"?value="20"/>
</bean>

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

三、通过IOC容器获取Bean属性

=====================

我们现在大概了解到了如果进行ioc容器的实例化和获取,那么我们在获取到ioc容器之后一般是如何获取其中的bean属性的呢?在spring中获取bean常用的方法是getBean(),该方法中的参数不同,所表示的含义也不同。

在这里介绍两种在spring中常用的获取bean的方法,

1、通过bean属性的id进行获取


这种方法需要知道我们所要获取的bean在容器中定义的id,如在ioc容器中有如下bean的定义:

<bean?id="person01"class=“com.spring.beans.Person”></bean>

则通过bean的id获取这个bean属性的方法就是:


ApplicationContext iocContext?= new?ClassPathXmlApplicationContext("ioc.xml");
/**
?* 普通方法获取参数
?* */
@Test
public?void?test01() {
Person person01?= (Person)iocContext.getBean("person01");
System.out.println(person01);
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

2、通过bean的类型来进行获取


这种方法是在getBean()中赋于类的class进行获取的,方法如下:


ApplicationContext iocContext?= new?ClassPathXmlApplicationContext("ioc.xml");
/**
?* 通过bean的类型获取参数
?* */
@Test
public?void?test02() {
Person person01?= (Person)iocContext.getBean(Person.class);
System.out.println(person01);
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

有小伙伴可能就问了,要是在ioc容器中定义多个同一个类的bean属性,那么使用该方法到底该获取哪一个呢?

哎,这就对了!

所以这一种方法只能在ioc中只有一个该类型的bean时进行获取,否则就会报以下错误:

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.spring.beans.Person] is defined: expected single matching bean but found 4: person01,person03,person04,person05

也就是说,没有找到结果,原因是符合要求的bean有多个,不知道该用哪一个了!

那么要是还是想用这一种方法,那该怎么办呢?

接下来就是第三种方法了。

3、通过类和属性名获取参数


这种方法是上面两个方法的结合体,在getBean()中传入的参数是两个,分别是属性的id和bean属性的类型,如下:


ApplicationContext iocContext?= new?ClassPathXmlApplicationContext("ioc.xml");
/**
?* 通过类和属性名获取参数
?* */
@Test
public?void?test02() {
Person person02 = (Person)iocContext.getBean("person01",Person.class);
System.out.println(person02);
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

以上就是从ioc容器中获取bean属性的常用方法,

接下来我来和大家聊一下在IOC容器中又该如何给bean中的属性进行赋值呢?

四、在IOC中给bean的属性赋值的多种方法

==========================

现在我们已经知道了如何在容器中添加需要的bean了,那么接下来就是如何对这些bean进行赋值的问题,针对bean中属性的类型不同,spring中有多种为bean中属性赋值的方法。接下来我们对这几种方法一一介绍。

1、通过无参构造并指定属性赋值


首先第一种方法,也是最普通常用的一种方法,就是利用bean中属性的set方法进行赋值,这种方法对属性的赋值语句需要写了<bean></bean>的<property></property>中,


<!-- 通过无参构造并指定属性进行赋值 ?-->
<bean?id="person01"?class="com.spring.beans.Person">
<property?name="name" value="张三"></property>
<property?name="age"?value="18"></property>
<property?name="sex"?value="男"></property>
<property?name="email"?value="133@qq.com"></property>
</bean>

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

其中的name中的参数是你在bean中定义的属性名,value是你将要赋予的属性值,

2、通过有参构造并指定属性进行赋值


上面那种方法指定在bean没有有参构造器的情况下进行属性的赋值的方法,那么现在这种方法就是,当bean中存在有参构造器时使用的赋值方法,当然,当bean中同时存在有参构造和无参构造器时,上面那种方法还可以使用!

通过有参构造器进行赋值使用的并不是<property></property>,而是在<constructor-arg></constructor-arg>中,其中的参数name和value与上面的含义一样。


<!-- 通过有参构造并指定属性进行赋值 ?-->
<bean?id="person03"?class="com.spring.beans.Person">
<constructor-arg?name="name"?value="小明"></constructor-arg>
<constructor-arg?name="sex"?value="男"></constructor-arg>
<constructor-arg?name="age"?value="30"></constructor-arg>
<constructor-arg?name="email"?value="xioaming@136.com"></constructor-arg>
</bean>

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

3、通过有参构造不指定属性进行赋值


第二种方法介绍了使用有参构造指定属性进行赋值,但是有小伙伴们就该说了,那这不是和第一种方法使用差不多嘛,哎,那我们现在再来看一种方法。利用有参构造不指定属性进行赋值,也就是说不使用name了,直接使用value进行赋值。比如我们的bean中的有参构造器长这样:


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

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

那么通过有参构造不指定属性进行赋值时,就需要将赋值元素书写的顺序按照有参构造器中元素属性的顺序进行书写了


<!-- 通过有参构造不指定属性进行赋值,但是需要按照构造函数的参数顺序赋值 -->
<!-- Person(String name, int?age, String sex, String email) -->
<!-- 重载情况下type可以指定参数的类型 -->
<bean?id="person04"?class="com.spring.beans.Person">
<constructor-arg?value="小刚"></constructor-arg>
<constructor-arg?value="20"></constructor-arg>
<constructor-arg?value="男"></constructor-arg>
<constructor-arg?value="xiaogang@qq.com"></constructor-arg>
</bean>

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

在这里有一点需要注意:

就是如果两个有参构造器属于重载,那么在ioc中进行赋值时就需要使用type在 value的后面指明赋值的元素的属性,比如是string还是int型的。

关于type的使用我们看下面的方法!

4、通过索引值指定参数的位置


当我们在使用有参构造器不指定属性赋值时,还有另外的方法,可以不必须的按照顺序来书写赋值。那就是使用索引和属性类型了,**使用索引进行赋值时需要使用到index参数,指定要赋值的属性的序号,**如对于上面person的构造函数,使用index指定元素位置进行赋值。name的index是0,age是1.


<bean?id="person04"?class="com.spring.beans.Person">
<constructor-arg?value="20"?index=”1”></constructor-arg>
<constructor-arg?value="小刚"?index=”0”></constructor-arg>
<constructor-arg?value="xiaogang@qq.com"?index=”3”></constructor-arg>
<constructor-arg?value="男"?index=”2”></constructor-arg>
</bean>

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

按照上面的方式同样可以得到相同的赋值效果

5、通过类型不同区分重载的构造器


如我们现在有两个同名的有参构造器,但是其中参数类型不一样,如果我们依然使用上面的两种方法来对bean中的属性进行赋值,那么明显是会报错提示构造器不唯一的。

所以这个时候就需要使用type指定参数的类型,同时index和type可以结合使用,如下:


<bean?id="book"?class="com.atguigu.spring.bean.Book"?>
??????<constructor-arg?value=?"10010"?index?="0"?type="java.lang.Integer"?/>
??????<constructor-arg?value=?"Book01"?index?="1"?type="java.lang.String"?/>
??????<constructor-arg?value=?"Author01"?index?="2"?type="java.lang.String"?/>
??????<constructor-arg?value=?"20.2"?index?="3"?type="java.lang.Double"?/>
</bean?>

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

6、利用P名称空间进行赋值


下面我们来介绍一个全新的赋值方式,利用P名称空间进行赋值。

为了简化XML文件的配置,越来越多的XML文件采用属性而非子元素配置信息。Spring从2.5版本开始引入了一个新的p命名空间,可以通过<bean>元素属性的方式配置Bean的属性。

使用p命名空间后,基于XML的配置方式将进一步简化。具体使用如下,

首先我们应该在xml文件中加入P名称空间的使用插件。

加入P名称空间的使用插件的方法如下:以eclipse为例:

之后在xml的头文件的<beans>中看到如下代码就添加成功了,或者直接在<beans>头文件中加入以下代码:

xmlns:p= http://www.springframework.org/schema/p

P名称空间的使用方法是这样的,在<bean></bean>建立完成之后,直接在<bean>中使用P:的格式进行赋值。


<!-- 通过p名称空间对bean进行赋值,导入p名称空间 -->
<!-- 利用名称空间的作用是防止标签重复的 -->
<bean?id="person05"?class="com.spring.beans.Person"?
p:name="小哈"?p:age="21"?p:sex="女"?p:email="xiaoha@wx.com"></bean>

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

这样也能达到为bean进行赋值的效果。

对于上面进行赋值的几种方法,我们在直接获取到ioc对象之后,调用期getBean方法就可以获取到对象的bean,并且可以获取到其中某一个属性的值。

我们来演示一下:


/**
?* 通过p标签对bean进行赋值
?* */
@Test
# **结尾**
![查漏补缺:Java岗 千+道面试题Java基础+全家桶+容器+反射+异常等](https://s2.51cto.com/images/20210808/1628430896716703.jpg)
这不止是一份面试清单,更是一种”被期望的责任“,因为有无数个待面试者,希望从这篇文章中,找出通往期望公司的”钥匙“,所以上面每道选题都是结合我自身的经验于千万个面试题中经过艰辛的两周,一个题一个题筛选出来再次对好答案和格式做出来的,面试的答案也是再三斟酌,深怕误人子弟是小,影响他人仕途才是大过,也希望您能把这篇文章分享给更多的朋友,让他帮助更多的人,帮助他人,快乐自己,最后,感谢您的阅读。
**资料领取方式:戳这里免费获取**
**由于细节内容实在太多啦,在这里我花了两周的时间把这些答案整理成一份文档了,在这里只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!**![](https://s2.51cto.com/images/20210808/1628430896108745.jpg)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
版权声明
本文为[程序员夏亚]所创,转载请带上原文链接,感谢
https://blog.51cto.com/u_15308638/3314538

  1. 【计算机网络 12(1),尚学堂马士兵Java视频教程
  2. 【程序猿历程,史上最全的Java面试题集锦在这里
  3. 【程序猿历程(1),Javaweb视频教程百度云
  4. Notes on MySQL 45 lectures (1-7)
  5. [computer network 12 (1), Shang Xuetang Ma soldier java video tutorial
  6. The most complete collection of Java interview questions in history is here
  7. [process of program ape (1), JavaWeb video tutorial, baidu cloud
  8. Notes on MySQL 45 lectures (1-7)
  9. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  10. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  11. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  12. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  13. 【递归,Java传智播客笔记
  14. [recursion, Java intelligence podcast notes
  15. [adhere to painting for 386 days] the beginning of spring of 24 solar terms
  16. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)
  17. K8s Series Part 8 (service, endpoints and high availability kubeadm deployment)
  18. 【重识 HTML (3),350道Java面试真题分享
  19. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  20. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  21. [re recognize HTML (3) and share 350 real Java interview questions
  22. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  23. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  24. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  25. RPC 1: how to develop RPC framework from scratch
  26. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  27. RPC 1: how to develop RPC framework from scratch
  28. 一次性捋清楚吧,对乱糟糟的,Spring事务扩展机制
  29. 一文彻底弄懂如何选择抽象类还是接口,连续四年百度Java岗必问面试题
  30. Redis常用命令
  31. 一双拖鞋引发的血案,狂神说Java系列笔记
  32. 一、mysql基础安装
  33. 一位程序员的独白:尽管我一生坎坷,Java框架面试基础
  34. Clear it all at once. For the messy, spring transaction extension mechanism
  35. A thorough understanding of how to choose abstract classes or interfaces, baidu Java post must ask interview questions for four consecutive years
  36. Redis common commands
  37. A pair of slippers triggered the murder, crazy God said java series notes
  38. 1、 MySQL basic installation
  39. Monologue of a programmer: despite my ups and downs in my life, Java framework is the foundation of interview
  40. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)
  41. 一线互联网企业中,springboot入门项目
  42. 一篇文带你入门SSM框架Spring开发,帮你快速拿Offer
  43. 【面试资料】Java全集、微服务、大数据、数据结构与算法、机器学习知识最全总结,283页pdf
  44. 【leetcode刷题】24.数组中重复的数字——Java版
  45. 【leetcode刷题】23.对称二叉树——Java版
  46. 【leetcode刷题】22.二叉树的中序遍历——Java版
  47. 【leetcode刷题】21.三数之和——Java版
  48. 【leetcode刷题】20.最长回文子串——Java版
  49. 【leetcode刷题】19.回文链表——Java版
  50. 【leetcode刷题】18.反转链表——Java版
  51. 【leetcode刷题】17.相交链表——Java&python版
  52. 【leetcode刷题】16.环形链表——Java版
  53. 【leetcode刷题】15.汉明距离——Java版
  54. 【leetcode刷题】14.找到所有数组中消失的数字——Java版
  55. 【leetcode刷题】13.比特位计数——Java版
  56. oracle控制用户权限命令
  57. 三年Java开发,继阿里,鲁班二期Java架构师
  58. Oracle必须要启动的服务
  59. 万字长文!深入剖析HashMap,Java基础笔试题大全带答案
  60. 一问Kafka就心慌?我却凭着这份,图灵学院vip课程百度云