Spring中设计模式
Spring中的设计模式有好几种,在此主介绍单例模式和工厂模式。
单例模式
因为Spring依赖注入Bean默认是单例的。Spring的依赖注入都是发生在AbstractBeanFactory的getBean里。getBean的doGetBean方法调用getSingleton进行bean的创建。
getSingleton过程图:
总结
单例模式定义为:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
spring对单例的实现:spring中的单例模式提供了全局的访问点BeanFactory。但没有从构造器级别去控制单例,这是因为spring管理的是任意的java对象。
工厂模式
实现方式:FactoryBean接口
实现原理:实现了FactoryBean接口的bean是一类叫做factory的bean。其特点是,spring会在使用getBean()调用获得该bean时,会自动调用该bean的getObject()方法,所以返回的不是factory这个bean,而是这个bean.getOjbect()方法的返回值。
例子:spring和Mybatis结合的工厂模式
<!-- 配置SqlSessionFactoryBean -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 配置mybatis-config.xml -->
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<!-- 事务 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 配置Mapper映射文件 -->
<property name="mapperLocations" value="classpath:mapper/*.xml"></property>
</bean>
说明:从以上看出该bean,因为实现了FactoryBean接口,所以返回的不是 SqlSessionFactoryBean 的实例,而是它的SqlSessionFactoryBean.getObject() 的返回值。
Spring对象生命周期
- scope=“singleton” 容器级别 -> 单例模式:节约资源开销
- scope=“prototype” 对象级别
- scope=“request” 请求级别
- scope=“session” 会话级别