Spring--配置补充(Bean的作用域及自动装配)

一、Spring中Bean的作用域

1.

作用域

说      明

singleton

默认值。Spring以单例模式创建Bean的实例,即容器中该Bean的实例只有一个

prototype

每次从容器中获取Bean时,都会创建一个新的实例

request

用于Web应用环境,针对每次HTTP请求都会创建一个实例

request

用于Web应用环境,同一个会话共享同一个实例,不同的会话使用不同的实例

global session

仅在Portlet的Web应用中使用,同一个全局会话共享一个实例。对于非Portlet环境,等同于session

注:request、request、global session仅适用于WebApplicationContext环境

Singleton:单例作用域,是spring容器默认的作用域,使用singleton作用域生成的是单实例,在整个Bean容器中仅保留一个实例对象供所有调用者共享引用。单例模式一般适用于那些无会话状态的Bean(比如辅助工具类,DAO组件,业务逻辑组件等等)

Prototype:原型模式,这是多实例作用域,针对每次不同请求,Bean容器均会生成一个全新的Bean实例以供调用者使用,他适用于那些需要保持会话状态的Bean实例,有一点值得注意:Spring不能对一个property bean的整个生命周期负责,容器在初始化、装配好一个property实例之后,就将他交给客户端,就不管了。因此客户端要负责property实例的生命周期管理

Request:针对每次HTTP请求,spring容器都会根据bean的定义创建一个全新的bean实例,并且该bean实例仅在当前http request内有效,因此可以根据需要放心的更改实例内部状态,而其他请求中根据Bean定义创建的实例,不会看到这些特定于某些请求的状态变化,当处理请求结束,request作用域的Bean实例将被销毁,该作用域仅在基于web的spring ApplicationContext情形下才有效

Session:针对某个HTTP session ,Spring容器会根据bean定义创建一个全新Bean实例,并且该Bean实例仅在当前的HTTP session内有效。该作用域仅在基于web的spring ApplicationContext情形下才有效

Global session:该作用域类似于标准的http session 作用域,不过他仅仅在基于portlet的web应用中才有意义。。。。该作用域仅在基于web的spring ApplicationContext情形下才有效

  • 实例
<!-- 指定Bean的作用域为prototype -->
<bean id="……" class="……" scope="prototype">
    ……
</bean>

2.singleton与prototype区别:

3.使用注解指定Bean的作用域

  • 使用@Scope注解指定Bean的作用域
@Scope("prototype") 
@Service("userService") 
public class UserServiceImpl implements UserService {
	// 省略其他代码
}

二、Spring自动装配

1.什么是自动装配

<!-- 配置业务Bean并注入DAO实例 -->
<bean id="userService" class="cn.smbms.service.user.UserServiceImpl">
    <property name="userMapper" ref="userMapper" />
</bean>
  • Spring可以根据属性类型、名称等自动进行注入

2.如何使用自动装配

  • 设置<bean>元素的autowire属性
<!-- 配置业务Bean,根据属性名称自动装配 -->
<bean id="userService" class="cn.smbms.service.user.UserServiceImpl"
    autowire="byName" />

3.Spring提供的4种自动装配类型

取值

说明

 no

默认值。Spring 默认不进行自动装配,必须显式指定依赖对象 

 byName

根据属性名自动装配。Spring 自动查找与属性名相同的id,如果找到,则自动注入,否则什么都不做

 byType

根据属性的类型自动装配。Spring 自动查找与属性类型相同的Bean,如果刚好找到唯一的那个,则自动注入;如果找到多个与属性类型相同的Bean,则抛出异常;如果没找到,就什么也不做

 constructor

和byType 类似,不过它针对构造方法。如果 Spring 找到一个Bean和构造方法的参数类型相匹配,则通过构造注入该依赖对象;如果找不到,将抛出异常 

 

4.进阶

每个Bean都需要设置autowire属性,较繁琐

可以为<beans>元素设置default-autowire属性,影响全局

  • <bean>节点上autowire的设置可以覆盖全局设置
<beans …… default-autowire="byName">
    <!--省略其他代码-->
</beans>

自动装配使得配置文件可以非常简洁,但同时也造成组件之间的依赖关系不明确,容易引发一些潜在的错误,在实际项目中要谨慎使用  



三、拆分配置文件—拆分策略

1.为什么需要拆分配置文件

  • 项目规模变大,配置文件可读性、可维护性差
  • 团队开发时,多人修改同一配置文件,易发生冲突

2.拆分策略

  • 公用配置+每个系统模块一个单独配置文件(包含DAO、Service、Web控制器)
  • 公用配置+DAO Bean配置+业务逻辑Bean配置+Web控制器配置
  • 两种策略各有特色,适用于不同场合

3.引入拆分后的配置文件

两种方法

  • 利用ClassPathXmlApplicationContext 的重载方法可以配置多个配置文件,用逗号隔开或者使用通配符
public ClassPathXmlApplicationContext( String  configLocation ); 

//以String[ ]方式传入多个配置文件名
public ClassPathXmlApplicationContext( String…  configLocations );
  • 使用<import  resource="xxx.xml"/>方式

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值