Spring Framework
IoC容器
Spring Framework 的控制反转 (IoC) 容器,IoC 也称为依赖注入 (DI)
1.对象仅通过构造函数参数、工厂方法的参数或在 对象实例被构造 或从工厂方法返回后设置的属性来 定义它们的依赖关系(即与它们一起工作的其他对象)
2.容器在创建 bean 时注入这些依赖项。 这个过程基本上是 bean 本身通过使用类的直接构造 或诸如服务定位器模式之类的机制来 控制其依赖关系的实例化 或位置的逆过程(因此称为控制反转)
简单概括:定义依赖关系 -> 控制其依赖关系的实例化
依赖注入(DI): 基于构造函数的依赖注入和基于 Setter 的依赖注入
Spring 团队通常提倡构造函数注入,因为它允许您将应用程序组件实现为不可变对象,并确保所需的依赖项不是null
ApplicationContext接口
- 代表 Spring IoC 容器,负责实例化、配置和组装 bean
- 容器通过 读取配置元数据 来获取关于要实例化、配置和组装哪些对象的指令
- 基于注解的配置元数据
- @Autowired
- 应用于构造函数
- 如果目标 bean 仅定义一个构造函数开始,则不再需要对此类构造函数进行注释。但是,如果有多个构造函数可用并且没有主/默认构造函数,则必须至少对其中一个构造函数进行注释,@Autowired以指示容器使用哪一个
- 应用于传统的setter 方法
- @Autowired(required = false):使框架能够通过将其标记为非必需来跳过不可满足的注入点
- @Resource
- @Resource采用名称属性。默认情况下,Spring 将该值解释为要注入的 bean 名称。
- @Value
- 用于注入外部属性@value(“${xxx.xxx}”),结合@Configuration
@PropertySource(“classpath:xxxx.yml”)
- 用于注入外部属性@value(“${xxx.xxx}”),结合@Configuration
- @Autowired
类路径扫描和托管组件
- @Component是任何 Spring 管理的组件的通用构造型
- @Repository在持久层(已经支持作为持久层中自动异常转换的标记)
- @Service在服务层
- @RestController在表示层
- @RestController在Spring MVC 的注解由@Controller和 组成@ResponseBody
- 自动检测类和注册 Bean 定义
- 添加 @ComponentScan到您的@Configuration类中,其中basePackages属性是两个类的公共父包。(或者,您可以指定一个逗号或分号或空格分隔的列表,其中包括每个类的父包。)
@Configuration
@ComponentScan(basePackages = "org.example")
public class AppConfig {
// ...
}
基于Java的容器配置
- 核心工件:@Configuration注释的类和带@Bean注释的方法
- @Bean注解用于表示一个方法实例化、配置和初始化一个由 Spring IoC 容器管理的新对象
- @Configuration表明它的主要目的是作为 bean 定义的来源
对属性源的可配置层次结构的搜索操作
Spring 的Environment抽象提供了对属性源的可配置层次结构的搜索操作
ApplicationContext ctx = new GenericApplicationContext();
Environment env = ctx.getEnvironment();
boolean containsMyProperty = env.containsProperty("my-property");
System.out.println("Does my environment contain the 'my-property' property? " + containsMyProperty);
Spring StandardEnvironment 配置了两个 PropertySource 对象——一个代表 JVM 系统属性集(System.getProperties()),一个代表 系统环境变量集(System.getenv())
自定义属性源:请实现并实例化您自己的PropertySource并将其添加到PropertySources当前Environment
ConfigurableApplicationContext ctx = new GenericApplicationContext();
MutablePropertySources sources = ctx.getEnvironment().getPropertySources();
sources.addFirst(new MyPropertySource());