Spring系列教程四:Spring对Bean的管理细节

一、Spring创建bean的三种方式

①使用默认构造函数创建

在spring配置文件中使用bean标签,配以id和class属性后,且没有其他属性和标签时。采用的就是默认构造函数创建bean对象,此时如果类中没有默认构造函数,则对象无法创建,示例子如下

c219b5c7183755d1f511ca2847e3ad4c6b9.jpg

在accountServiceImpl结构中本来是有一个默认构造函数,现在我们在默认构造函数里面传了几个参数进去,不再重新创建默认构造函数,现在我们来点击运行一下,结果如下,显示创建实例对象失败,没有找到默认构造函数,与此同时我们的配置文件也在报错

5e112bc9afaf9c8510251b3093cad3ce6a2.jpg

e912d50ef43d056ef924bd789decbfcc077.jpg

94346a220944cf88cc8bd04f2a05b586f52.jpg

181dd977d04047c0b13fded1ea719518256.jpg

②使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并且存入spring容器)

首先我们先创建一个工厂类,通过工厂类最终来得到一个AccountService对象

877587500b572a93b0db8c12f3c23e12e67.jpg

那么我们bean配置文件中修改的代码如下,根据上面注释掉的代码得知,我们是要通过唯一的id标示符获得一个新的对象,但是这样写的话,这样创建出来的是我们的需要的那个accountServie对象嘛,实际上我们得到的是一个工厂对象,我们要的是工厂对象里面return出来的那个对象

da84d54112008202b4cb1495aa0f4e12a2d.jpg

d8529ad28364e23423e1bc5937ea468311e.jpg

正确的写法是上面的第二张图,我们是要通过工厂对象创建accountService对象,那好,第一行是创建是工厂对象,我们是需要用它里面的方法创建我们需要的accountSerivce对象,那么地二行我们就需要定义一个accountService对象,那么这个对象是怎么来的啦?是factory-bean这个id,里面指定的factory-method这个方法return出来的

③使用普通工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并且存入spring容器)

先创建一个静态的工厂类的方法

8863b9a04b7116768a26023abd84c3e0a1b.jpg

在配置文件中做出的改动,这样写的话就是我们需要创建出来的那个对象嘛??只是创建的一个Staticfactory对象,那怎么才能取到我们需要的accountService对象啦??这个时候就需要在后面加factory-method,直接调用静态方法,执行结果如第三张图

a036827d767e3709462952a4e21f70f614a.jpg

de9564d2e92c098703054fb6495089f15ab.jpg

二、bean对象的作用范围

在工厂模式中解耦的时候,我们都知道bean是个单例对象,那么我们强大的Spring对象是不是也知道bean是个单例对象啦??下面我们在容器中取两个对象,那么这个两个对象是不是同iyge对象啦!!

a115d0fc9d715191f2958c730bc2e4b6abc.jpg

构造函数只运行了一次,spirng 中的bean对象默认单例对象,那么怎么去调整这个bean对象作用范围?那就不得不用scope属性

24b388a77904829d4152fa9d275fc38da85.jpg

scope属性主要包括

singleton(单例,默认值)

prototype(多例)

request(作用于web应用的请求范围)

session(作用于web应用的会话范围)

golbal-session(作用于集群环境会话范围,也称为全局范围,当不是集群环境时候就是session)

 

当我们把作用范围改成prototype的时候,这个时候对象被创建了两次不是同一个对象

910620f3b47f9ba522d842482ec7abe8bf8.jpg

bbd21f24f454f9528cd57d3a3ea7c68b32b.jpg

有一个疑问?什么是golbal-session??好的各位大佬,下面给大家解释一下

我们在访问网站服务器的时候,要是访问的人数比较多的话,一台是不够的,而且这个时候就通过负载均衡来决定你的访问是用那一台空闲的服务器

这个时候你肯定是要登陆的,那么你的个人密码等信息如果是保持的第一台服务器session上的,那么下一次你在访问的时候,负载均衡会随机给你再分配一台空闲的服务器

那么这个时候必然会存在验证,实际情况中这种情况都是我们不希望遇见的,这个时候golbal session就起作用了,它把所有的session作为一个整体的session

a35998a7626181c79afd772b97dcd58271a.jpg

三、bean对象的生命周期

bean分为两种对象,一个是单例对象,一个是多例对象

4a16285535ac387f42aad2a18fffb2027ec.jpg

现在我们先试一下单例对象

79e9084b5783aac5deecd81652508dc9410.jpg

手动关闭如下,但是这个又是怎么回事?

365d0afad864b960540ea6b5005c65ab10a.jpg

显示结果如下,但是没有显示容器被习销毁了,这是怎么回事??main方法是一切程序的入口,还没来的及调用这个方法,都已经结束啦,这个时候需要我们手动关闭

0b79b669110035220e5fc75117f4fcd6e4e.jpg

主要是你用的是父借口去调用了子类特有的方法,当然是不能实现的,要换成子类,图下显示对象被销毁

3ae9619ac25f2d730ab266bd16136cb644e.jpg

8f416428003daa02a57c6c2d64abe437616.jpg

ea71bda27ddcde8d11188268f33a01f525f.jpg

转载于:https://my.oschina.net/u/4115727/blog/3049956

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值