1-依赖注入
Git:分布式版本控制
Beam:java中一个对象,Spring负责对象创建、管理这些对象
商品服务需要引用库存服务(依赖),如何知道库存服务的地址/引用?
1. Spring核心技术
- DI(Dependency Injection)
- 保留抽象接口,让组件(Component)依赖于抽象接口,当组件要与其他实际的对象发生依赖关系时,由抽象接口来注入依赖的实际对象
- AOP(Aspect Oriented Programming)
- 通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术
- 利用AOP可以对业务逻辑的各个部分进行隔离, 从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发效率
2. 常用注解
2.1. Bean
==Object=Bean=Component==
@Component
- 普通的Java类加
@Component
注解,Spring会实例化这个类 - Component value属性,指定Bean Id,默认为类名
- 普通的Java类加
@Autowired
- 自动注入,Spring从从容器的上下文找实现了某个接口的对象
- 找不到对象,注入失败
- 找到多个实现了这个接口的对象,也会报错
自动装配时歧义:如何解决Bean冲突?
@Qualifier
自定义限定符@Primary
在Bean上放指定- 自定义注解
@Profile需要在不同场景下运行不同Bean
@Conditional在运行环境下决定Bean是否要创建
2.2. 组件扫描
1 |
|
@ComponentScan
//找当前包下加了注解的类并实例化basePackages
- 是数组可以写多个
- 但是类型不安全,写错编译器不会报错
basePackageClasses
- 也是数组
- 到类所在的包和子目录下搜索
- 类型安全,但无法保证类一直存在
当使用 @ComponentScan
注解时,Spring会自动扫描指定包下的组件,并将其注册为Bean。如果你在配置类中手动定义了相同的Bean,那么就会导致重复定义的问题。
2.3. 👍Bean三种注入方法
2.3.1. 构造方法
- 在构造函数上使用 @Autowired 注解,用于自动注入构造函数参数所需要的 Bean。如果构造函数只有一个参数,则可以省略 @Autowired 注解。
1 |
|
2.3.2. setter方法
1 | public void setOrderRepo(OrderRepository orderRepo) { |
也可以加Autowired
自动注入.
1 |
|
2.3.3. 属性字段下加@Autowired
1 |
|
3. 👍Spring配置方案
- 自动配置
- JavaConfig
- XML配置(最早期)
SgtPeppers是一张CD
建议基于接口编程
3.1. 自动配置
- 组件扫描 component scanning
@Configuration
配置类@ComponentScan
- 自动装配 autowiring
@Autowired
- 构造方法
- 字段
- set方法
required=false
- 需要实例化的Bean:
@Component
- 默认是单实例模式,在Spring上下文永远只有一个实例
- 可以参数指定多实例
3.2. JavaConfig
- 应用场景:自动化配置行不通,如第三方库
- 注解
@Configuration
@Bean(name=“..”)
- 注入
- 调用方法
- 通过方法参数自动装配(其他配置类,其他方法创建的Bean)
只用于创建,不会把业务逻辑放进来。
3.3. XML
- 格式:
<beans><bean>
- 无类型检查
- 构造器注入
- constructor-arg
- c-命名空间
- 注入字面量值
- 注入集合
- 属性注入
- p-命名空间
- util-命名空间
建议:强依赖使用构造器注入
3.4. 混合配置
在根配置类中导入其他配置类。
- JavaConfig导入
@import(配置类,class,...)
@importResource(xml文件)
- XML导入
4. 应用上下文
- AnnotationConfigApplicationContext
- 基于注解配置生成
- ClassPathXmlApplicationContext
- AnnotationConfigWebApplicationContext
- FileSystemXmlApplicationContext
- XmlWebApplicationContext
5. Bean作用域
@Scope与@Component和@Bean一起使用,指定作用域
- Singleton,单例,整个应用之创建一个实例
- Prototype,原型,每次注入或者通过Spring应用上下文获取的时候,都会创建一个新bean实例
- Session,会话,在会话范围内有效
- Request,请求,在Web应用中,为每个请求创建一个bean实例
5.1. 单例
通过代理注入给单例对象
6. 运行时注入外部值
- 使用
Environment
属性 - 使用
@PropertySource(/path/to/file)
指定文件
6.1. Environment.getProperty的几种形式
String getProperty(String key)
String getProperty(String key, String defaultValue)
T getProperty(String key, Class type)
T getProperty(String key, Class type, T defaultValue
)
6.2. 使用占位符
${...}
- 标题: 1-依赖注入
- 作者: Charlie
- 创建于 : 2023-10-10 18:10:00
- 更新于 : 2024-07-05 12:55:04
- 链接: https://chillcharlie357.github.io/posts/a22fb360/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论