### 大厂真题之百度-Java中级.pdf
#### BeanFactory和ApplicationContext的区别
在Spring框架中,`BeanFactory`和`ApplicationContext`都是用来管理bean的容器,但是它们之间存在一些重要的区别。
- **BeanFactory**:
- `BeanFactory`可以被视为Spring容器的基本实现,它主要负责管理bean的生命周期,并在bean请求时返回相应的实例。
- `BeanFactory`包含bean的定义,能够根据定义来实例化bean,并处理协作类间的依赖关系。
- 它支持bean的生命周期管理,包括调用初始化方法和销毁方法。
- 但是,`BeanFactory`本身并不提供高级功能,如国际化支持、事件传播等。
- **ApplicationContext**:
- `ApplicationContext`建立在`BeanFactory`的基础上,不仅具备后者的所有功能,还提供了更多企业级服务的支持。
- 它提供了一种统一的方式来访问资源文件、支持国际化文本消息、注册监听器以处理bean的生命周期事件等。
- `ApplicationContext`还支持事件广播机制,使得各个bean之间可以通过事件进行通信。
- 此外,`ApplicationContext`还支持特定的应用层配置,例如Web应用特有的配置。
#### Spring Bean的生命周期
Spring Bean的生命周期涉及到初始化和销毁两个阶段:
- **初始化阶段**:
- 在bean首次被请求时,Spring会创建bean实例。
- 接下来会注入bean所需的依赖。
- 如果bean实现了`InitializingBean`接口或者配置了`init-method`属性,那么将在初始化完成后调用相应的初始化方法。
- **销毁阶段**:
- 当容器关闭时,如果bean实现了`DisposableBean`接口或者配置了`destroy-method`属性,则会在销毁前调用相应的销毁方法。
#### Spring IoC容器实现
Spring IoC容器主要包括两个核心包:`org.springframework.beans`和`org.springframework.context`。
- **BeanFactory**:
- `BeanFactory`接口提供了配置各种类型对象的能力。
- 它是Spring IoC容器的基础接口,负责管理容器中的bean。
- **ApplicationContext**:
- `ApplicationContext`接口扩展了`BeanFactory`,提供了额外的服务,如资源访问、事件处理等。
#### Spring AOP
面向切面编程(AOP)是一种编程范式,它允许开发者分离横切关注点,例如日志记录、性能监控等。Spring AOP通过代理机制实现AOP。
- **实现原理**:
- **JDK动态代理**: 要求被代理的类实现一个或多个接口。代理类通过实现相同接口的方式拦截目标类的方法调用。
- **CGLIB动态代理**: 如果目标类没有实现接口,则使用CGLIB进行代理。CGLIB通过继承目标类来生成代理类,这意味着目标类不能是final类。
#### 动态代理(CGLIB与JDK)
- **JDK动态代理**:
- 要求代理类和委托类都实现了相同的接口。
- 适用于那些已经实现了接口的类。
- 基于`java.lang.reflect.InvocationHandler`接口和`java.lang.reflect.Proxy`类实现。
- **CGLIB动态代理**:
- 用于那些没有实现接口的类。
- 通过字节码技术生成目标类的子类,从而实现代理功能。
- 不适用于final类,因为CGLIB是通过继承方式工作的。
#### Spring事务管理
Spring支持两种事务管理方式:
- **编程式事务管理**:
- 通过编码实现事务管理,类似于JDBC的事务管理方式。
- 通常用于需要细粒度控制事务边界的情况。
- **声明式事务管理**:
- 无需显式编程即可管理事务。
- 可以通过XML配置或使用`@Transactional`注解来声明哪些方法需要事务支持。
#### Spring事务底层原理
Spring事务管理的核心在于其对数据库连接的管理。Spring利用AOP机制来拦截被标记为需要事务的方法调用,并通过底层的事务管理器来处理事务的开启、提交或回滚等操作。
- **划分处理单元**:
- Spring通过AOP机制将事务管理逻辑与业务逻辑分离,使得业务代码更加简洁明了。
总体来说,Spring通过强大的IoC容器管理和控制着应用程序中的bean,同时利用AOP机制提供了灵活的事务管理策略。这种设计使得开发者可以专注于业务逻辑,而不需要过多关心基础设施的细节。