Spring 中的自动配置(Bean的自动注册、依赖注入(简单属性,其他Bean,细节问题))

本文介绍了Spring中的自动配置和Bean的自动注册,详细阐述了如何通过@Component注解及其实现类如@Controller、@Service、@Repository来标记Bean。内容包括Bean的Scope、生命周期方法、延迟实例化。此外,还深入讲解了依赖注入,包括简单属性注入、其他Bean的注入,并讨论了在注入过程中可能遇到的问题和解决方案。

Spring 中的自动配置

背景:
随着项目中要让Spring管理的对象越来越多,每个对象及其依赖都通过 XML的方式定义到配置文件中,这个工作量也不小。

Spring 就设想它自己来将你想要被管理的对象注册进容器中。

前提条件:

想要被管理的这个类跟其它普通的类有区别

这个区别通过标记注解来实现。Spring为我们提供了一些注解

步骤:

1>开启自动配置的功能

  • 跟注解有关的功能 ,导入 Spring 的 aop 模块的jar包.在这里插入图片描述
  • 在配置文件中使用 <context:component-scan> 来开启扫描

2> 类之间的依赖关系的注解

  • 使用Spring提供的标准注解 @Autowired
  • 使用Java标准的 @Resource
  • 使用Java标准的 @Inject (需要额外导入jar包)

3>这个区别通过标记注解来实现。Spring为我们提供了一些注解

  • @Controller这个是控制器。 用于描述 web层的处理器。
  • @Service: 用于描述 服务层的对象。
  • @Repository : 用于描述 Dao层的对象。
  • @Component : 一般性的组件
  • 效果上没有任何差别,但是使用时最好根据语义来区分。

总的逻辑就是通过在配置文件中使用 <context:component-scan> ,通过注解的形式将 依赖建立起来 并将对象放入spring容器中。

Bean的自动注册

要想使用spring的自动注册bean 的功能 需要先开启此功能

base-package属性 说明从哪个包开始进行扫描 ,扫描那个包,及其子包下 标记了特殊注解。
@Component 、 @Service 、@Repository 、@Controller

下图是spring-config.xml 文件,标记部分指从com.example 以下的包 只要 包含注解 都可以扫描的到:

在这里插入图片描述
演示Demo1的spring底层自己注册的bean:

在这里插入图片描述
显示打印spring底层自己注册的bean

在这里插入图片描述

总结:

(一)类上的@Component 一类的注解

  • 默认的Bean的名称: 类名首字母小写。
  • 要想自定义bean的名字,可以使用注解属性 value , 如: @Component(value="AAA")
  • 下图是给MyTestBean1加上注解
    在这里插入图片描述
    打印信息多了myTestBean1
    在这里插入图片描述
    value可省略
    在这里插入图片描述
    在这里插入图片描述

(二)要想为一个bean指定scope的范围,可以使用Scope注解:

@Scope(“singleton”) 单例(不加默认是单例)
在这里插入图片描述

在这里插入图片描述

@Scope(“prototype”) 每实例

在这里插入图片描述
在这里插入图片描述

(三)生命周期方法:

@PostContruct初始化

@PreDestroy销毁

下图验证:
在这里插入图片描述

在这里插入图片描述

(四)延迟实例化(单例对象)

用到@Lazy 注解:初始化过程延迟执行(可与上图对比查看效果)
在这里插入图片描述

依赖注入

(一)简单属性

使用 @Value 注解进行注入。

在这里插入图片描述

通过@Value注解来使用: properties的配置文件、 SpEL表达式
外部属性值的注入:仍然需要开启 property placeholder

下面是图片演示:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

<context:property-placeholder location=“classpath:com/example/spring/scan/db-info.properties”/>

SpEL表达式,天生支持。

(二)其它bean

  • @Resouce注解不能标记在构造方法上。而 @Autowired 可以。

(三)细节问题

使用自动注入时,可以完全不必定义setter方法或构造方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eFuHUN54-1600256135768)(imges/image-20200828105510845.png)]

当一个类仅有一个带参数的构造方法时,参数的类型会自动从Spring容器中获取
要注入的bean在Spring容器中不存在

解决方式:
1 )【最常用】, 自己想办法将依赖的类型注册到Spring容器即可。

2) 【不常用】, 我将此依赖标记为非必须的依赖。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DggLvBTB-1600256135782)(imges/image-20200828111109813.png)]

要注册的bean在Spring容器中的数量多于1个
  • @Autowired 注解 默认是按类型注入。只要容器中唯一存在该类型的bean,则自动注入。

    • 如果没有,看是否标记了 required=false ,标记了,保持默认值(不注入)。否则,抛出异常 。

    • 如果多于一个。

      • 优先看 变量名 是否 跟其中的一个 bean 的名字一致,如果一致,则用那个bean。

      • 如果都不一致,则抛出异常 NoUniqueBeanDefinitionException

      • 另外,也可以人为通过一些手段来处理

        • 方式1:

          • 人为指定一个主要的bean 。

          • 注意: 这个主要的bean 也不能多于一个。

        • 方式2:使用 @Qualifier 注解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值