一、Spring创建bean的三种方式

①使用默认构造函数创建

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

spring 设置默认mongo源 spring默认管理bean的方式_spring 设置默认mongo源

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

spring 设置默认mongo源 spring默认管理bean的方式_服务器_02

spring 设置默认mongo源 spring默认管理bean的方式_服务器_03

spring 设置默认mongo源 spring默认管理bean的方式_服务器_04

spring 设置默认mongo源 spring默认管理bean的方式_默认构造函数_05

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

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

spring 设置默认mongo源 spring默认管理bean的方式_默认构造函数_06

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

spring 设置默认mongo源 spring默认管理bean的方式_spring 设置默认mongo源_07

spring 设置默认mongo源 spring默认管理bean的方式_python_08

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

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

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

spring 设置默认mongo源 spring默认管理bean的方式_java_09

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

spring 设置默认mongo源 spring默认管理bean的方式_java_10

spring 设置默认mongo源 spring默认管理bean的方式_java_11



二、bean对象的作用范围

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

spring 设置默认mongo源 spring默认管理bean的方式_java_12

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

spring 设置默认mongo源 spring默认管理bean的方式_java_13

scope属性主要包括

singleton(单例,默认值)

prototype(多例)

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

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

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

 

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

spring 设置默认mongo源 spring默认管理bean的方式_服务器_14

spring 设置默认mongo源 spring默认管理bean的方式_spring 设置默认mongo源_15

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

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

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

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

spring 设置默认mongo源 spring默认管理bean的方式_java_16



三、bean对象的生命周期

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

spring 设置默认mongo源 spring默认管理bean的方式_python_17

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

spring 设置默认mongo源 spring默认管理bean的方式_服务器_18

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

spring 设置默认mongo源 spring默认管理bean的方式_spring 设置默认mongo源_19

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

spring 设置默认mongo源 spring默认管理bean的方式_服务器_20

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

spring 设置默认mongo源 spring默认管理bean的方式_默认构造函数_21

spring 设置默认mongo源 spring默认管理bean的方式_spring 设置默认mongo源_22

spring 设置默认mongo源 spring默认管理bean的方式_python_23