Spring IOC

是spring的两大重要特性,IOC就是控制反转、注入依赖么。他就是Spring将我们的类通过注解的方式,将他的创建和生命周期都放到Spring容器中统一管理,这样我们其他的类如果需要调用某个类就可以直接到Spring的容器工厂中去找。spring也提供了很多注解能让我们之间注册bean到容器中,以及注入使用的注解。

Spring AOP

AOP就是IOC的一个扩展,他是面向切面编程,其实就是一个动态代理,通常情况他的作用就是能实现我们非业务的代码,不去影响实际的业务,其实就是在不动已经完成的业务代码,想要在加上非业务的代码的时候会用到AOP思想,比如要看日志,算接口时间,事务管理等。
比如有一个user类,我想在它的add方法前后增加日志,通过AOP,Spring并不会入侵代码,而是创建一个和user类一模一样的代理对象,以后调用的其实是这个代理对象,代理对象会先执行日志任务再调用真正的user类中的add方法。Spring 会根据目标对象的类型,自动选一种代理方式:第一种是JDK动态代理,目标对象有接口时用,比如UserService实现了IUserService接口,Spring 就用 JDK 自带的工具生成一个实现了IUserService接口的代理类
这个代理类里会持有真正的UserService对象,当你调用addUser()时,代理类会先跑日志代码,再调用UserServiceaddUser()
第二个是CGLIB动态代理,目标对象无接口的时候,Spring 就用 CGLIB 生成一个继承UserService的子类当代理,子类会重写addUser()方法,在重写的方法里先执行日志逻辑,再调用父类(真正的UserService)的addUser()

循环注入

Bean的生命周期

IOC的加载其实就是一个Bean的创建么,Bean从创建到销毁就是它的生命周期,首先是类实例化,它是通过反射去找类的构造函数实例化的。再属性赋值,解析自动装配的,一般用@autowired或者@resource,解决了循环依赖的问题。接着是初始化,初始化的时候调用初始化生命周期回调,这个时候就可以使用该类了,最后容器关闭的时候,调用销毁生命周期回调,将Bean进行一个销毁处理。

Spring 的自动装配过程如何识别要装配的类?会扫描全部类吗?

Spring 识别要装配的类主要通过 组件扫描(Component Scan),而非扫描项目中的全部类,具体逻辑如下:他会扫描spring用注解标记的一些类,将标记的类注册为 Bean。开发者需在配置中指定扫描的包路径(如@ComponentScan("com.example")),Spring 仅扫描该路径下的类,不会扫描所有类,以此提升效率。

Spring Boot 自动配置原理?

  1. 注解驱动@SpringBootApplication 包含 @EnableAutoConfiguration,触发自动配置;
  2. SPI 机制:Spring 扫描 META-INF/spring.factories,加载所有 AutoConfiguration 类;
  3. 条件装配:通过 @Conditional(如 @ConditionalOnClass@ConditionalOnBean)判断环境是否满足,满足则自动创建 Bean。

@Component和@Bean

首先在用途方面和使用方法不同,Component注解是标识普通的类,spring会通过Componentscan扫描将类注册到spring IOC容器中。@bean一般是在配置类中的方法,声明和手动配置一个bean对象。Component注解是spring自动创建和初始化的,bean注解可以手动控制bean的创建和配置过程

@autowired和@resource

@Autowired 是 Spring 框架提供的注解,默认按类型(byType)注入,若存在多个同类型 bean,需配合 @Qualifier 指定名称;而 @Resource 是 JDK 提供的注解,默认按名称(byName)注入,名称匹配失败时会 fallback 到按类型匹配。Resource支持属性配置可以配置name type等

SSM

Spring + Spring MVC + MyBatis 三个框架的组合,是 Java 企业级开发中经典的 Web 应用架构。这三个框架各司其职,共同构成了一个完整的分层开发体系:

  • Spring:负责全局管理(IoC 容器、AOP 切面)和组件协调
  • Spring MVC:作为表现层框架,处理 HTTP 请求和响应;
  • MyBatis:作为数据访问层框架,简化数据库操作。