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 | |
setter 注入
可选依赖,次选
1 | |
字段注入(不推荐)
不选
1 | |
补充:被注入的依赖类(UserRepository)
带 @Repository 注解,会被 Spring 自动扫描为 Bean,默认作用域为 singleton(单例)。
1 | |
常用注解
@Autowired
@Autowired 用于自动注入依赖。
1 | |
@Component
@Component 用于标记一个类为 Spring 的 Bean,Spring 会自动将其实例化为一个 Bean 并添加到 Bean 容器
@Configuration
@Configuration 用于标记一个类为 Spring 的配置类,配置类可以包含@Bean 注解的方法,用于定义和配置 Bean,作为全局配置
1 | |
@Bean
@Bean 用于标记一个方法作为 Spring 的 bean 工厂方法,Spring 会将这个方法的返回值作为一个 Bean,并添加到 Spring 容器中,如果自定义配置,经常要用到这个注解
@Service
@Service 用于标记一个类为服务层的组件,是@Component 注解的一种特殊形式,用于标记服务层的 bean,一般标记在 serviceImpl(实现类)上
@Repository
@Repository 用于标记一个类为数据访问层的组件,也是@Component 注解的一种特殊形式,用于标记数据访问层的 bean
1 | |
@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。它的执行流程是这样的:
扫描 spring.factories 文件:当 Spring Boot 启动时,它会读取项目中的每个 META-INF/spring.factories 文件,这些文件列出了需要自动装配的配置类。这些配置类通常包含了自动装配相关的 Bean。
条件判断:它会根据一定的条件来判断是否加载某个配置。常见的条件注解包括:
- @ConditionalOnMissingBean:判断某个 Bean 是否未被定义。
- @ConditionalOnClass:判断类路径中是否存在特定的类。
- @ConditionalOnProperty:根据配置文件中的属性来判断是否装配。
自动装配:满足条件的配置类会被加载,并在 Spring 容器中注册相应的 Bean,这使得自动装配生效,应用可以使用这些自动装配的组件。。
自动装配的执行流程
- @SpringBootApplication 注解会触发@EnableAutoConfiguration 注解,然后启动自动装配流程,SpringBoot会扫描并加载spring.factories文件中列出的自动配置类
- 自动配置类根据条件注解判断是否满足某些条件,例如
- 类路径中是否存在指定的类(例如数据库连接池的实现类)。
- 项目中是否已经存在某个 Bean(例如某个服务类)。
- 配置文件中是否启用了相关功能(例如是否配置了数据源 URL)。
- 加载到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。