实例化bean的三种方式


第一种: 使用无参构造函数(重点第一种,二三种已经没太多人用了)

 

hi是一个简单的bean , 只有println();

"binbin" class="test_one.hi">

id 是唯一标识, class是类路径(src/main/java是默认路径,不可更改,所以必须在该目录下添加包,并且为了能找到该类,该类需要在头上加package,很显然两者是对应的)

scope: 指定对象作用范围  singleton : 默认值,单例模式(只要被实例化,该实例就会一直存活,除非容器销毁或退出,并且IoC容器只存在一个实例,所有对该对象的引用将共享这个实例) prototype: 多例模式(每次请求都将创建一个新的实例,当实例长时间不用会被java的垃圾回收机制回收)

request, session, global session 这三种只适用于web应用程序,通常是与XmlWebApplicationContext共同使用

单例模式:

 多例模式:

 如果创建一个新的实例classpathxmlapplicationcontext, 他们之间的地址是不一样的,由于ApplicationContext是继承BeanFactory,所以我们可以说

在同一个容器内,单例模式下的实例为同一实例,在同一容器内访问该实例为同一实例,引用对象共享实例

从上面的singleton模式我们就能明白,为什么一个实例可以一直存在并且对该对象的引用都共享这个实例. 如果这个实例要不一样的属性呢?

bean就是可复用的类, 因为有的类每次我们实例化就只要用里面的函数,  不需要将实例当作数据一样对待..而bean的出现就解决了繁琐地创建实例以及浪费内存资源

那为什么是无参构造函数呢? 因为可复用类不能用有参构造函数

下面是如何从配置文件中获得实例化bean

可以看出,我们通过bean.xml文件,通过getBean(唯一标识id)得到我们想要的对象,而不用我们主动去创建对象,这就是典型的工厂模式。 getBean是BeanFactory接口的方法,返回得对应id的实例。

第二种 :使用静态工厂创建

bean.xml

<?xml version="1.0" encoding="UTF-8"?>

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

class="test_one.hi">

class="test_one.static_test" factory-method="sayStatic">

id 唯一标识; class 类路径;   factory-method 工厂方法名

static_test类

如何通过静态工厂得到实例

 第一种是直接从配置文件bean.xml得到实例,而第二种是从配置文件bean.xml寻找对应的静态方法,再从静态方法返回实例。

那么静态工厂是单例模式吗? 就是每次调用的时候不会创建新的实例,会共享实例。

在spring中默认是单例模式, 不在spring是多例

已删除

第三种: 实例工厂创建实例

 普通方法无法像静态方法一样实现单例模式,而实例工厂就是让普通方法可以和静态方法一样实现单例模式

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="binbin" class="test_one.hi" scope="prototype">bean>

<bean id="static" class="test_one.static_test" factory-method="sayStatic">bean>

<bean id="instance" class="test_one.instance">bean>
<bean id="createInstance" factory-bean="instance" factory-method="createHi">bean>
beans>

instance.java

得到实例化

 第三种有点复杂

静态工厂模式和实例模式都会多实例化一个对象,也就是静态方法或者方法所在的类

以上三种实例化bean的方法, 在程序开始运行后就已经实例化了, 如果在bean中加入构造函数就会发现哪怕没有获取实例化也执行了构造函数, 这就说明开始就已经实例化了

 参考:

Bean的3种实例化

Bean的3种实例化