一、Spring概述

1.1 Spring是什么

Spring是一个分层的Java SE/EE full-stack(一站式,指的是它能够为Java应用提供从表现层到持久层的完整解决方案)轻量级开源框架,以 IOC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核。

在Java三层架构当中分别提供了相应技术:

表现层(web层) :SpringMVC 框架

业务层(service层) :Bean管理(IOC容器),声明式事务

持久层(dao层) :JdbcTemplate模板对象以及提供了ORM模块整合其他优秀的持久层技术

1.2 Spring框架的优势

方便解耦,简化开发: Spring 就是一个大工厂,可以管理所有对象的创建和依赖关系维护,交给Spring管理

AOP 编程的支持: 可以方便的实现对程序进行权限拦截,日志记录,运行的监控

声明式事务的支持: 通过配置方式完成对事务的管理,无需手动编程

方便程序的测试: 对Junit支持,可以通过注解方便的对Spring程序进行测试

整合外部优秀技术: Spring内部提供了对各种优秀框架(Hibernate,Mybatis,Quartz等)的直接支持

二、Spring IOC 机制的详解

2.1  IOC 核心概念

2.1.1     控制反转 (Inversion of Control)

控制反转是一种设计原则,它将传统编程中由程序主动创建和管理对象的方式反转,改由容器来负责对象的创建和依赖注入。例如:

  • 传统方式:UserService userService = new UserServiceImpl();
  • IOC方式:容器自动创建并注入UserService实例

2.1.2     依赖注入 (Dependency Injection)

依赖注入是IOC的具体实现方式,主要有三种形式:

  1. 构造器注入:通过构造函数参数注入依赖
  2. Setter注入:通过setter方法注入依赖
  3. 字段注入:通过反射直接注入字段(不推荐)

2.2 Spring IOC 容器实现

2.2.1 BeanFactory

基础IOC容器接口,提供基本的DI功能:

  • 延迟初始化:只有使用时才创建Bean
  • 适合资源受限环境
  • 核心方法:getBean(), containsBean(), isSingleton()

2.2.2 ApplicationContext

BeanFactory的扩展,提供更多企业级功能:

  • 预初始化所有单例Bean
  • 支持国际化、事件发布
  • 集成AOP、事务管理等
  • 常见实现类:
    • ClassPathXmlApplicationContext:基于类路径的XML配置
    • AnnotationConfigApplicationContext:基于注解的配置
    • WebApplicationContext:Web应用专用

2.3 Bean 生命周期管理

完整生命周期包含以下阶段:

  1. 实例化:调用构造函数创建对象
  2. 属性赋值:注入依赖属性
  3. 初始化
    • 调用BeanNameAware接口方法
    • 调用BeanFactoryAware接口方法
    • 调用@PostConstruct注解方法
    • 调用InitializingBean.afterPropertiesSet()
    • 调用自定义init方法
  4. 使用中:业务方法调用
  5. 销毁
    • 调用@PreDestroy注解方法
    • 调用DisposableBean.destroy()
    • 调用自定义destroy方法

2.4 依赖注入方式详解

2.4.1 XML配置方式

<bean id="userService" class="com.example.UserServiceImpl">
    <property name="userDao" ref="userDao"/>
</bean>

<bean id="userDao" class="com.example.UserDaoImpl"/>

2.4.2 注解配置方式

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;
    
    // ...
}

@Repository
public class UserDaoImpl implements UserDao {
    // ...
}

2.4.3 Java配置方式

@Configuration
public class AppConfig {
    @Bean
    public UserService userService() {
        return new UserServiceImpl(userDao());
    }
    
    @Bean
    public UserDao userDao() {
        return new UserDaoImpl();
    }
}

2.5  高级特性

2.5.1 自动装配

  • @Autowired:按类型自动装配
  • @Qualifier:配合@Autowired指定具体Bean
  • @Resource:JSR-250标准注解,可按名称或类型装配

2.5.2 作用域管理

  • singleton:默认,每个容器一个实例
  • prototype:每次请求新实例
  • request:每个HTTP请求新实例
  • session:每个HTTP会话新实例
  • application:ServletContext生命周期

2.5.3 条件化装配

  • @Conditional:基于条件创建Bean
  • @Profile:环境相关的Bean配置

2.6  实际应用场景

2.6.1 服务层解耦

通过IOC容器管理Service及其依赖的DAO,实现层间解耦。

2.6.2 单元测试支持

可以轻松替换真实依赖为Mock对象进行测试。

2.6.3 插件式架构

通过配置不同的Bean实现,无需修改代码即可切换功能模块。

2.6.4 微服务配置

在Spring Cloud中,IOC容器管理各种微服务组件及其依赖关系。

三、Spring IOC 机制的详解

3.1  IOC 核心概念

3.1.1 控制反转 (Inversion of Control)

控制反转是一种设计原则,它将传统编程中由程序主动创建和管理对象的方式反转,改由容器来负责对象的创建和依赖注入。例如:

  • 传统方式:UserService userService = new UserServiceImpl();
  • IOC方式:容器自动创建并注入UserService实例

3.1.2 依赖注入 (Dependency Injection)

依赖注入是IOC的具体实现方式,主要有三种形式:

  1. 构造器注入:通过构造函数参数注入依赖
  2. Setter注入:通过setter方法注入依赖
  3. 字段注入:通过反射直接注入字段(不推荐)

3.2  Spring IOC 容器实现

3.2.1 BeanFactory

基础IOC容器接口,提供基本的DI功能:

  • 延迟初始化:只有使用时才创建Bean
  • 适合资源受限环境
  • 核心方法:getBean(), containsBean(), isSingleton()

3.2.2 ApplicationContext

BeanFactory的扩展,提供更多企业级功能:

  • 预初始化所有单例Bean
  • 支持国际化、事件发布
  • 集成AOP、事务管理等
  • 常见实现类:
    • ClassPathXmlApplicationContext:基于类路径的XML配置
    • AnnotationConfigApplicationContext:基于注解的配置
    • WebApplicationContext:Web应用专用

3.3  Bean 生命周期管理

完整生命周期包含以下阶段:

  1. 实例化:调用构造函数创建对象
  2. 属性赋值:注入依赖属性
  3. 初始化
    • 调用BeanNameAware接口方法
    • 调用BeanFactoryAware接口方法
    • 调用@PostConstruct注解方法
    • 调用InitializingBean.afterPropertiesSet()
    • 调用自定义init方法
  4. 使用中:业务方法调用
  5. 销毁
    • 调用@PreDestroy注解方法
    • 调用DisposableBean.destroy()
    • 调用自定义destroy方法

3.4  依赖注入方式详解

3.4.1 XML配置方式

<bean id="userService" class="com.example.UserServiceImpl">
    <property name="userDao" ref="userDao"/>
</bean>

<bean id="userDao" class="com.example.UserDaoImpl"/>

3.4.2 注解配置方式

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;
    
    // ...
}

@Repository
public class UserDaoImpl implements UserDao {
    // ...
}

3.4.3 Java配置方式

@Configuration
public class AppConfig {
    @Bean
    public UserService userService() {
        return new UserServiceImpl(userDao());
    }
    
    @Bean
    public UserDao userDao() {
        return new UserDaoImpl();
    }
}

3.5  高级特性

3.5.1 自动装配

  • @Autowired:按类型自动装配
  • @Qualifier:配合@Autowired指定具体Bean
  • @Resource:JSR-250标准注解,可按名称或类型装配

3.5.2 作用域管理

  • singleton:默认,每个容器一个实例
  • prototype:每次请求新实例
  • request:每个HTTP请求新实例
  • session:每个HTTP会话新实例
  • application:ServletContext生命周期

3.5.3 条件化装配

  • @Conditional:基于条件创建Bean
  • @Profile:环境相关的Bean配置

3.6  实际应用场景

3.6.1 服务层解耦

通过IOC容器管理Service及其依赖的DAO,实现层间解耦。

3.6.2 单元测试支持

可以轻松替换真实依赖为Mock对象进行测试。

3.6.3 插件式架构

通过配置不同的Bean实现,无需修改代码即可切换功能模块。

3.6.4 微服务配置

在Spring Cloud中,IOC容器管理各种微服务组件及其依赖关系。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐