spring 容器

spring 容器

在基于spring的应用中,应用的对象生存于spring 容器中,容器负责创建和装配对象, 配置他们并且管理他们的整个声明周期。容器是spring 框架的核心,spring容器使用DI (依赖注入)管理构成应用的组建,他会创建相互协作的组建之间的关联

spring 容器可以分为两种不同的类型 bean工厂,以及应用上下文。 其中 bean工厂是最简单的容器,提供基本的DI 支持,而应用上下文则是基于beanFactory 构建,并提供应用框架级别的服务

spring 应用上下文

spring 自带多种类型的应用上下文

  1. annotationConfigApplicationContext :从一个或多个基于Java的配置类中加载spring应用上下文
  2. annotationConfigWebApplicationContext :从一个或多个基于Java 的配置类中价值spring
    web 应用上下文
  3. ClassPathXmlApplicationContext 从类路径下的一个或多个xml
    配置文件中加载上下文定义,把应用上下文的定义文件作为类资源
  4. FileSystemXmlApplicationContext 从文件系统的xml 配置文件中加载上下文定义
  5. XmlWebApplicationContext 从web 应用下的xml 配置文件中加载上下文定义

当应用上下文准备就绪后,我们可以调用上下文的getBaen()方法从容器中获取bean

Spring Bean 的生命周期

传统Java应用中,bean 的声明周期很简单,使用new 关键字进行bean 的实例化,然后就可以使用bean了。当不使用了,则由Java的垃圾回收机制回收 ,而spring的bean 有属于自己的过程

  1. spring 对bean 进行实例化
  2. spring 将值和bean 的引用注入到bean 对于的属性中
  3. 如果bean 实现了 BeanNameAware 接口,则将bean 的id 传递给setBeanName 方法
  4. 如果实现了BeanFactoryAware 接口 ,调用setBeanFactory 方法,将beanFactory 容器实力传入
  5. 如果实现了ApplicationContextAware 接口, 将调用setApplicationContext 方法,将 bean
    所在的应用上下文引用传入进来
  6. 如果bean 实现了 beanPostProcessor 接口
  7. 如果实现了 InitializingBean
  8. beanPostProcessor
  9. 经过上面的准备,bean 已经准备就绪了,可以被应用程序使用,他们会一直驻留在应用上下文中,知道应用上下文被销毁
  10. 如果bean 实现了DisposableBean 接口,spring将调用它的destroy 方法
### Spring容器的使用与原理 Spring容器Spring框架的核心组件,它通过IoC(控制反转)和DI(依赖注入)机制为开发者提供对象管理和依赖配置的功能[^1]。Spring容器的主要职责是管理Bean的生命周期、创建和装配依赖关系,从而让开发者可以专注于业务逻辑开发,而无需手动管理复杂的依赖关系。 #### 1. Spring容器的核心概念 Spring容器基于IoC(Inversion of Control)的设计理念,将对象的创建和依赖关系的管理从代码中分离出来,交由容器统一管理[^3]。这种设计降低了组件间的耦合度,提高了代码的可维护性和可测试性。在Spring中,IoC容器通过两种主要方式实现:`BeanFactory` 和 `ApplicationContext`[^2]。 - **BeanFactory**:这是Spring框架的基础基础设施,提供了基本的IoC功能。`BeanFactory` 是一个延迟加载的容器,只有在需要时才会实例化Bean。 - **ApplicationContext**:它是`BeanFactory`的扩展,提供了更多的企业级功能,例如AOP支持、国际化、事件传播等。`ApplicationContext`通常用于更复杂的场景。 #### 2. Spring容器的工作原理 Spring容器的工作原理可以分为以下几个关键步骤: - **BeanDefinition注册**:Spring容器会将所有的Bean定义信息(如类名、属性值、依赖关系等)解析并存储到一个Map结构中,这个Map就是所谓的容器[^4]。每个Bean都会被封装成一个`BeanDefinition`对象,其中包含了Bean的所有元数据信息。 - **Bean实例化**:当需要某个Bean时,Spring容器会根据`BeanDefinition`中的信息创建Bean实例。如果Bean有依赖关系,容器会自动解析并注入这些依赖。 - **依赖注入**:Spring容器通过构造函数注入、Setter方法注入或字段注入等方式,将依赖的Bean注入到目标Bean中。 - **生命周期管理**:Spring容器会管理Bean的整个生命周期,包括初始化、使用和销毁。开发者可以通过实现特定的接口(如`InitializingBean`、`DisposableBean`)或使用注解(如`@PostConstruct`、`@PreDestroy`)来定制Bean的生命周期行为。 #### 3. Spring容器的使用示例 以下是一个简单的Spring容器使用示例,展示如何通过`ApplicationContext`管理Bean。 ```java // 定义一个简单的Service类 public class GreetingService { public void greet() { System.out.println("Hello, Spring!"); } } // 配置文件(XML方式) <beans> <bean id="greetingService" class="com.example.GreetingService"/> </beans> // 使用Spring容器加载Bean public class MainApp { public static void main(String[] args) { // 创建Spring容器 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); // 获取Bean GreetingService greetingService = (GreetingService) context.getBean("greetingService"); // 调用方法 greetingService.greet(); } } ``` 在现代Spring应用中,更多地使用Java配置或注解方式替代XML配置。例如: ```java // 使用注解定义Bean @Component public class GreetingService { public void greet() { System.out.println("Hello, Spring!"); } } // 使用Spring容器加载Bean public class MainApp { public static void main(String[] args) { ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); GreetingService greetingService = context.getBean(GreetingService.class); greetingService.greet(); } } ``` #### 4. Spring容器的优势 - **降低耦合度**:通过IoC容器管理依赖关系,组件之间的耦合度显著降低。 - **提高可测试性**:依赖注入使得单元测试更加容易,因为可以轻松地替换依赖项。 - **简化开发**:Spring容器负责对象的创建和管理,开发者只需关注业务逻辑。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值