spring入门:第二节——Bean管理xml
PS:该文章只是做一个理论梳理和介绍,还需要结合实际操作来掌握知识,该篇文章仅作为概念介绍和对实际操作的梳理,如果有帮上忙的话,非常荣幸。
第一部分:
1.创建对象。上一节说到,在程序中使用spring框架,可以有效的降低程序的耦合度,这一节就来说说如何在程序中使用spring的写法。
第一步:在src目录下创建xml文件(配置文件),通过bean标签将Java类连接到BeanFactory中,形成一个Bean类,写法如下:
<Bean id="" class=""></Bean>
id:作者可以自行定义id名称,这个属性相当于每个人的姓名,可以通过id来区分不同的Bean。
class:选择Bean要连接的类,指定src目录下类的完整路径来进行连接。
示例:
1 | <bean id="1" class="spring5testcollection.ctype.Stu"> |
通过Bean标签连接了spring5testcollection包下的ctype包下的Stu类,设置了这个Bean标签的id为1。
第二步:在Java类中通过Applicationcontext这一属性来导入xml配置文件:
示例:
1 | ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml"); |
1.1ApplicationContext 和BeanFactory
ApplicationContext 和BeanFactory都可以用于导入配置文件,那么这两者有什么区别呢。
BeanFactory:Spring自带的属性,在导入配置文件的时候不会生成对象,只有当对象被调用的时候才会创建对象。
ApplicationContext:BeanFactory的子类,在导入配置文件的时候会创建对象。
为什么选择ApplicationContext:BeanFactory只有在使用的时候才会创建对象,确实是节省了资源,但是导入配置文件的操作一般的执行时机是程序初始化的时候,在程序初始化的过程中完成对象的创建,之后在调用程序的时候就不用分出资源去进行对象创建了,从开发角度来讲,ApplicationContext更符合开发的需求,所以选择ApplicationContext。
1.2ApplicationContext的路径
ApplicationContextApplicationContext:从src目录下开始查找xml文件路径
FileSystemXmlApplicationContext:从C盘目录下开始查找xml文件路径
第三步:依赖注入(注入属性)。在xml文件中定义Java类的属性的值。
注入属性的方法:property标签
<property name="" value=""></property>
name:要注入值得属性名。Bean标签连接了一个UmaC类,UmaC类中有一个String类型的属性umaid,我们想要给这个umaid赋值,那第一步做什么,自然是在Bean标签的范围内写Property标签,就好像你找浙江省的EML,跑到江苏省的地皮去找,那肯定是找不着人的,所以第一步要做的就是在正确的Bean标签下写property标签,第二步,在property的name中写上umaid,通过xml配置文件告诉程序,我找的就是那个叫umaid的小子。
value:程序看到name上写了umaid,瞬间懂了,来一句“太君,this way”,带着property标签找到了这个属性,那人找到了,接着干什么呢,注入属性,所以value这个标签就写上你想注入的值。
示例:
1 | <bean id="3" class="spring5testcollection.ctype.UmaC"> |
这时候有的同学就想,这人也找到了,注入的属性也确定了,那下一步总该是狠狠的注入了吧。然而现实就是“达咩”,为什么捏,因为这个属性没有Set方法,是没有办法通过标签注入属性的,就好像你找到别人家门口,做好准备大干一场了,但是没有钥匙开门,所以下一步就是在Java类中定义Set方法,也就是教你如何开门。
示例:
1 | private String Umaid; |
定义了Set方法之后,property可以通过name找到Set方法,然后注入value了,第一种属性注入的方式就完成了。
第二种注入方式:有参构造器注入
和property类似,但是第一点要求Java类中有有参构造器,另外就是不能用property了,要用标签 <Constructor-arg name="" value=""></Constructor-arg>
(未完待续)
碎碎念:写文实在太累人了,所以之后可能就是做一些我自己看的懂的知识梳理,以后有空的时候再尽量写成容易看懂的大白话吧。中间打老头环和无双类游戏摸了很久的鱼,上一次更新spring还是在3.4,哎,我这态度属实摆烂王了。
第二部分开始都是个人化的梳理:
第二部分:Bean管理xml方式
1.注入空值和特殊符号
字面量:注入的属性值。
注入空值:
<property name="">
<null/>
</property>
注入特殊符号:
2.注入外部Bean
property标签使用ref属性注入外部属性
一:Dao接口
二:Dao实现类
三:service层,调用了Dao类,并设置了Set方法。这里的Set方法是必要的,只有Java类拥有Set方法(属性处于可写状态下),标签才能对Java类创建对象和注入属性。
四:property通过ref属性调用id为UserDao的bean类。这里值得注意的是id为UserDao的Bean类,class的路径指向是接口的实现类,不能是什么具体类都没有的接口。
3.注入内部Bean,级联赋值
(1)Bean标签写在property内,就叫注入内部Bean
<bean id="1" class="spring5test.employee.emp">
<property name="dept">
<bean id="2" class="spring5test.employee.dep">
<property name="dname" value="人事部"></property>
</bean>
</property>
</bean>
(2)注入内部Bean的第二种写法
1 | <bean id="1" class="spring5test.employee.emp"> |
(3)级联赋值
同时对多个Java类赋值,就叫做级联赋值
4.注入集合类型属性
(1)四种集合:数组,list,map,set
<bean id="1" class="spring5testcollection.ctype.Stu">
<property name="course">
<array>
<value>
Mcqueen </value>
<value>
Teio </value>
<value>
Ogrin </value>
<value>
卤豆腐 </value>
</array>
</property>
<property name="list">
<list>
<value>
special week </value>
<value>
grass wonder </value>
<value>
pasa </value>
</list>
</property>
<property name="maps">
<map>
<entry key="one" value="tama cross"></entry>
<entry key="two" value="baxin"></entry>
<entry key="three" value="gold ship"></entry>
</map>
</property>
<property name="sets">
<set>
<value>
北部玄驹 </value>
<value>
里见光钻 </value>
<value>
大鸣大放 </value>
</set>
</property>
</bean>
(2)注入对象类型的属性
<bean id="1" class="spring5testcollection.ctype.Stu">
<property name="list">
<list>
<ref bean="2"></ref>
<ref bean="3"></ref>
</list>
</property>
</bean>
<bean id="2" class="spring5testcollection.ctype.UmaC">
<property name="umaid" value="001"></property>
</bean>
<bean id="3" class="spring5testcollection.ctype.UmaC">
<property name="umaid" value="002"></property>
</bean>
(3)通过util名称空间提取公共属性
一、xmlns设置util名称空间
原始配置的xmlns:
配置util名称空间:
二、util名称空间提取属性
1 | <util:list id="umayo"> |
三、在property标签中通过ref和id将util名称空间的属性进行注入
1 | <bean id="1" class="spring5testcollection.ctype.Umaid"> |
最后放一张思维导图