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注解
-
-
-

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

被折叠的 条评论
为什么被折叠?



