Spring知识

Spring 框架核心特性

  • Ioc 容器:开发者只需定义好 Bean 及其依赖关系,Spring 负责创建和组装这些对象
  • AOP:面向切面编程(aspect-oriented programming),定义横切关注点,例如事务管理,统一设置更新时间等
  • 事务管理:Spring 提供了一致的事务管理接口, 支持声明式(@Transactional) 和编程式事务,开发者可以轻松的进行事务管理
  • MVC 框架:Spring MVC 是一个基于 Servlet API 侯建的 Web 框架,采用了模型-视图-控制器(MVC)架构,它支持灵活的 URL 都到页面控制器的映射,以及多种视图技术

Ioc 容器

  • 传统的 JavaSE 是通过 new 来主动的创建对象,而 IoC 将对象的创建、依赖关系和生命周期的控制权交给容器统一管理。
  • Bean 就是 Spring 容器创建的单例,用的时候只需要注入就行了。
  • Spring IOC 容器利用了 Java 的反射机制动态地加载类,创建对象实例及调用对象方法,反射允许在运行时检查类、属性方法等信息。

依赖注入

注入的时候是 spring 根据这个类名,用反射的方式将对应的单例传进来,赋给这个属性。

构造器注入
不可变依赖,首选
如果用 Lombok,可以用@RequiredArgsConstructor 加 final 字段来省略构造器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import org.springframework.stereotype.Service;

@Service
public class UserService {

private final UserRepository userRepository;

// Spring 4.3+:只有一个构造函数时,@Autowired 可省略
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}

public void register(String username) {
userRepository.save(username);
}
}

setter 注入
可选依赖,次选

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

private UserRepository userRepository;

@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}

public void register(String username) {
if (userRepository != null) {
userRepository.save(username);
}
}
}

字段注入(不推荐)
不选

1
2
3
4
5
6
7
8
9
10
11
12
13
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

@Autowired
private UserRepository userRepository; // ← 直接注入字段

public void register(String username) {
userRepository.save(username); // 若未正确注入,会抛 NullPointerException
}
}

补充:被注入的依赖类(UserRepository)
带 @Repository 注解,会被 Spring 自动扫描为 Bean,默认作用域为 singleton(单例)。

1
2
3
4
5
6
7
8
9
import org.springframework.stereotype.Repository;

@Repository
public class UserRepository {

public void save(String username) {
System.out.println("Saving user: " + username);
}
}

常用注解

@Autowired

@Autowired 用于自动注入依赖。

1
2
3
4
5
6
7
8
9
10
// 注册为Bean
@Component
public class UserService {}

@Component
public class UserController {
// 注入
@Autowired
private UserService userService;
}

@Component

@Component 用于标记一个类为 Spring 的 Bean,Spring 会自动将其实例化为一个 Bean 并添加到 Bean 容器

@Configuration

@Configuration 用于标记一个类为 Spring 的配置类,配置类可以包含@Bean 注解的方法,用于定义和配置 Bean,作为全局配置

1
2
3
4
5
6
7
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
return new MyBean();
}
}

@Bean

@Bean 用于标记一个方法作为 Spring 的 bean 工厂方法,Spring 会将这个方法的返回值作为一个 Bean,并添加到 Spring 容器中,如果自定义配置,经常要用到这个注解

@Service

@Service 用于标记一个类为服务层的组件,是@Component 注解的一种特殊形式,用于标记服务层的 bean,一般标记在 serviceImpl(实现类)上

@Repository

@Repository 用于标记一个类为数据访问层的组件,也是@Component 注解的一种特殊形式,用于标记数据访问层的 bean

1
2
@Repository
public class UserRepository {}

@Controller

@Controller 用于标记一个类作为控制层的组件,也是@Component 注解的一种特殊形式,用于标记控制层的 bean。这是 MVC 架构中的控制器

@Mapper

  • 这个是MyBatis 的注解,用于标记接口为 Mapper 接口,调用Mapper方法时,Mybatis会对这个类进行jdk动态代理,在生成的代理对象中会将xml中的sql语句进行解析,并执行
  • 代理对象的 invoke() 方法中会拦截所有方法调用,并将其转换为对应的 SQL 执行逻辑。
  • 为什么要这么做?
    • sql写在xml中,就将sql与业务解耦,修改sql不用重新编译代码
    • xml中有多个标签,可以实现动态sql和复杂sql

自动装配原理

自动装配机制的触发

启动类上加上@SpringBootApplication,这是SpringBoot应用程序的入口注解,它还集成了多个注解功能

  • @EnableAutoConfiguration:开启自动配置功能
  • @ComponentScan:开启组件扫描功能
  • @Configuration:声明当前类为配置类

@EnableAutoConfiguration

它的作用是自动根据项目的依赖和类路径来装配必要的 Bean。它的执行流程是这样的:

  1. 扫描 spring.factories 文件:当 Spring Boot 启动时,它会读取项目中的每个 META-INF/spring.factories 文件,这些文件列出了需要自动装配的配置类。这些配置类通常包含了自动装配相关的 Bean。

  2. 条件判断:它会根据一定的条件来判断是否加载某个配置。常见的条件注解包括:

    • @ConditionalOnMissingBean:判断某个 Bean 是否未被定义。
    • @ConditionalOnClass:判断类路径中是否存在特定的类。
    • @ConditionalOnProperty:根据配置文件中的属性来判断是否装配。
  3. 自动装配:满足条件的配置类会被加载,并在 Spring 容器中注册相应的 Bean,这使得自动装配生效,应用可以使用这些自动装配的组件。。

自动装配的执行流程

  1. @SpringBootApplication 注解会触发@EnableAutoConfiguration 注解,然后启动自动装配流程,SpringBoot会扫描并加载spring.factories文件中列出的自动配置类
  2. 自动配置类根据条件注解判断是否满足某些条件,例如
    • 类路径中是否存在指定的类(例如数据库连接池的实现类)。
    • 项目中是否已经存在某个 Bean(例如某个服务类)。
    • 配置文件中是否启用了相关功能(例如是否配置了数据源 URL)。
  3. 加载到IOC容器
    条件满足时,自动装配的配置类会被加载,并注册到IOC容器中,比如,如果 @ConditionalOnClass(DataSource.class) 条件成立,Spring Boot 就会自动装配数据库连接池的相关 Bean。
    然后我们就能使用这些自动装配的组件了。

例子

自动装配配置数据源

  • 首先启动类上加上@SpringBootApplication
  • 然后在application.properties文件中添加数据源配置,比如MySQL的,spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver以及url、用户名和密码
  • 然后启动的时候,SpringBoot就会扫描application.properties文件中的配置,发现条件满足就会将配置文件中的信息注入,然后自动创建DataSourceBean。

Spring知识
http://www.981928.xyz/2025/12/11/Spring知识/
作者
981928
发布于
2025年12月11日
许可协议