Spring-IoC-03

bean scope属性

singleton单例

singleton是容器默认的scope,所以写和不写没有区别。scope为singleton的时候,在Spring的IoC容器中只存在一个实例,所有对该对象的引用将共享这个实例。该实例从容器启动,并因为第一次被请求而初始化后,将一直存活到容器退出,也就是说,它与IoC容器“几乎”拥有相同的寿命

  • 对象实例数量:singleton类型的bean定义,在一个容器中只存在一个共享实例,所有对该类型bean的依赖都引用这一单一实例
  • 对象存活时间:singleton类型bean定义,从容器启动,到它第一次被请求而实例化开始,只要容器不销毁或退出,该类型的单一实例就会一直存活

优点:

在单例模式下,可以减少每次创建对象的内存空间,减少CPU的计算资源。

全局只有一个对象,当多次调用该对象时,会不会出现堵塞现象?

singleton在容器是单例多线程执行,不会造成堵塞

缺点:

存在线程安全风险。

演示:

在这里插入图片描述

当由两个任务需要调用a对象的num属性时,任务A在调用setNum(1),同时任务B调用setNum(2),再次之后任务A调用getNum()输出a的num时却不是1,而是2。

prototype多例

对于那些请求方不能共享的对象实例,应该将其bean定义的scope设置为prototype。这样,每个请求方可以得到自己对应的一个对象实例。通常,声明为prototype的scope的bean定义类型,都是一些有状态的,比如保存每个顾客信息的对象

缺点:

prototype在容器中多实例,占用更多资源。

优点:

不存在线程安全问题。

singleton与prototype对比

singletonprototype
对象数量全局唯一存在多个
实例化时机IoC容器启动时getBean()或对象注入时
线程安全问题存在不存在
执行效率

基于注解与java config配置IoC容器

基于注解的配置文件

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

    <context:annotation-config/>

</beans>

组件类型注解

这四个注解,均使用在类上

@Component 组件注解,通过注解,被该注解描述的类将被IoC容器管理并实例化

@Controller 语义注解,说明当前类是MVC应用中的控制器类

@Service 语义注解,说明当前类是Service业务服务类

@Repository 语义注解,说明当前类用于业务持久层,通常描述对应Dao类

开启组件扫描

<!--XML配置开启组件扫描,才能使用注解-->
<context:component-scan base-package="package">
    <!--排除某些类-->
	<context:exclude-filter type="regex" expression="Class"/>
</context:component-scan>

组件类型注解默认beanId为类名首字母小写;
使用注解的value属性修改beanId。

自动装配注解

按类型装配:

@AutoWired 按容器内对象类型动态注入属性,由Spring机构提供

@Inject 基于JSR-330标准,其他通@AutoWired,但不支持required属性

按名称装配:

@Named 与@Inject配合使用,JSR-330规范,按属性名自动装配属性

@Resource 基于JSR-250规范,优先按名称、再按类型智能匹配

@AutoWired

如果注解放在set方法上,则自动按类型/名称对set方法参数进行注入

如果注解放在属性上,spring IoC容器会自动通过反射技术将属性private修饰符自动改为public,直接进行赋值

@Resource
  1. @Resource设置name属性,则按name在IoC容器中将bean注入

  2. @Resource未设置name属性

    1. 以属性名作为bean name在IoC容器中匹配bean,如有匹配则注入
    2. 按属性名未匹配,则按类型进行匹配,同@AutoWired,需要加入@primary解决类型冲突

在使用@Resource对象时推荐设置name或保证属性名与bean名称一致

元数据注解

为spring IoC容器管理对象时提供一些辅助信息

@Primary 按类型装配时出现多个相同类型对象,拥有此注解对象被优先注入

@PostConstruct 描述方法,相当于XML中init-method配置的注解版本

@PreDestroy 描述方法,相当于XML中destroy-method配置的注解版本

@Scope 设置对象的scope属性

@Value 为属性注入静态数据

基于java Config配置IoC容器

优势

完全摆脱XML的束缚,使用独立java类管理对象与依赖

注解配置相对分散,利用java Config可对配置集中管理

可以在编译时进行依赖检查,不容易出错

java Config核心注解

@Configuration 描述类,说明当前类是Java Config配置类,完全替代XML文件

@Bean 描述方法,方法返回对象将被IoC容器管理,beanId默认为方法名

@ImportResource 描述类,加载静态文件,可使用@Value注解获取

@ComponentScan 描述类,同XML的 <context:compoment-scan> 标签

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alonzo de blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值