实例化bean的三种⽅式
第⼀种: 使⽤⽆参构造函数(重点第⼀种,⼆三种已经没太多⼈⽤了)
hi是⼀个简单的bean , 只有println();
<bean id="binbin"class="test_one.hi"></bean>
id 是唯⼀标识, class是类路径(src/main/java是默认路径,不可更改,所以必须在该⽬录下添加包,并且为了能到该类,该类需要在头上加package,很显然两者是对应的) scope: 指定对象作⽤范围 singleton : 默认值,单例模式(只要被实例化,该实例就会⼀直存活,除⾮容器销毁或退出,并且IoC容器只存在⼀个实例,所有对该对象的引⽤将共享这个实例) prototype: 多例模式(每次请求都将创建⼀个新的实例,当实例长时间不⽤会被java的垃圾回收机制回收)
request, session, global session 这三种只适⽤于web应⽤程序,通常是与XmlWebApplicationContext共同使⽤
单例模式:
多例模式:
如果创建⼀个新的实例classpathxmlapplicationcontext,他们之间的地址是不⼀样的,由于ApplicationContext是继承BeanFactory,所以我们可以说
在同⼀个容器内,单例模式下的实例为同⼀实例,在同⼀容器内访问该实例为同⼀实例,引⽤对象共享实例
从上⾯的singleton模式我们就能明⽩,为什么⼀个实例可以⼀直存在并且对该对象的引⽤都共享这个实例. 如果这个实例要不⼀样的属性呢?
bean就是可复⽤的类, 因为有的类每次我们实例化就只要⽤⾥⾯的函数, 不需要将实例当作数据⼀样对待..⽽bean的出现就解决了繁琐地创建实例以及浪费内存资源
那为什么是⽆参构造函数呢?因为可复⽤类不能⽤有参构造函数
下⾯是如何从配置⽂件中获得实例化bean
可以看出,我们通过l⽂件,通过getBean(唯⼀标识id)得到我们想要的对象,⽽不⽤我们主动去创建对象,这就是典型的⼯⼚模式。 getBean是BeanFactory接⼝的⽅法,返回得对应id的实例。
第⼆种:使⽤静态⼯⼚创建
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/schema/beans
/schema/beans/spring-beans.xsd">
<!--使⽤⽆参构造函数实例化-->
<bean id="binbin" class="test_one.hi"></bean>
<!--使⽤静态⼯⼚实例化-->
<bean id="static" class="test_one.static_test" factory-method="sayStatic"></bean>
</beans>
id 唯⼀标识; class 类路径; factory-method ⼯⼚⽅法名
static_test类
如何通过静态⼯⼚得到实例
第⼀种是直接从配置⽂件l得到实例,⽽第⼆种是从配置⽂件l寻对应的静态⽅法,再从静态⽅法返回实例。
那么静态⼯⼚是单例模式吗?就是每次调⽤的时候不会创建新的实例,会共享实例。
静态⼯⼚是单例模式,因为静态⽅法的⽣命周期是整个进程,内存地址是不变的,所以返回的实例的地址是不变的,为同⼀个实例
第三种:实例⼯⼚创建实例
普通⽅法⽆法像静态⽅法⼀样实现单例模式,⽽实例⼯⼚就是让普通⽅法可以和静态⽅法⼀样实现单例模式
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/schema/beans
/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
得到实例化
第三种有点复杂
静态⼯⼚模式和实例模式都会多实例化⼀个对象,也就是静态⽅法或者⽅法所在的类参考:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论