1.Spring 是什么?核心特性?
Spring是一个轻量级Java开发框架,用来简化企业级开发,管理对象、整合其他技术
两大核心特征
- IOC控制反转
- 把对象的创建、依赖注入交给Spring管理
- 不用自己new对象,解耦、方便维护
- AOP面向切面编程
- 把日志、事务、权限等通用功能抽成切面
- 不修改业务代码就能统一增强,实现解耦
- 其他常用特征
- DI依赖注入:IOC的具体实现方式
- 声明式事务:用注解@Transactional管理事务
- 整合MyBatis、SpringMVC、SpringBoot、Redis等几乎所有主流框架
- 支持面向接口编程,方便测试、扩展
总结
Spring是java一站式开发框架,核心是IOC管理对象、AOP统一增强,简化开发、解耦、方便整合各种技术。
2.IOC 是什么?DI 是什么?
1.IOC(Inversion of Control)控制反转
把对象的创建和管理权,从程序员反转给Spring容器
- 以前:自己new UserService()、自己管理依赖
- 现在:Spring帮你new、帮你管理对象生命周期
- 目的:解耦,不用硬编码依赖关系
IOC是一种思想/设计模式,不是具体技术
2.DI(Dependcecy Injection)依赖注入
Spring自动把需要的对象赋值给成员变量,不用自己set。
比如:
@Service
public class UserService {
@Autowired
private UserDao userDao; // Spring 自动注入进来
}
- DI是IOC的具体实现方法
- 注入方式:
-
- 构造器注入(推荐)
-
- setter注入
-
- 字段注入(@AutoWired)
总结
- IOC是思想:控制权反转,由Spring管理对象
- DI是手段:通过注入自动负之依赖
- 关系:IOC是目标,DI是实现IOC的方法
3.AOP 是什么?应用场景?
AOP:面向切面编程,在不修改原有业务代码的前提下,对方法进行统一增强。
核心思想:把日志、事务、权限、统计等通用逻辑抽离出来,形成一个切面(Aspect),动态切入到目标方法的前后或异常位置。
常用术语:
- 切面(Aspect):要增强的功能(日志、事务)
- 切点(Pointcut):哪些方法需要被增强
- 通知(Advice):什么时候增强(前、后、异常、环绕)
AOP典型应用场景
1.声明式事务
@Transactional底层就是AOP,自动开启、提交、回滚事务。
2.统一日志记录
记录方法入参、出参、执行时间
3.权限控制
方法执行前校验是否登录、是否有权限
4.接口限流/防重复提交
方法执行前做拦截控制。
总结
AOP面向切面编程,用户横向抽取通用逻辑,不改动业务代码实现统一增强;最常用在事务、日志、权限、限流、监控。
4.Bean 的作用域
- singleton(单例,默认)
- 整个容器只能创建一个Bean实例
- 全局共享,每次获取都是同一个对象
- 适合无状态Bean:Service、Dao、Controller
- prototype(原型)
- 每次获取(@Autowired/getBean)都创建新对象
- 多例,不共享
- 适合有状态、线程不安全的Bean
- request(Web环境)
- 每次HTTP请求创建一个Bean
- 请求结束销毁
- session(Web环境)
- 每个用户会话(Session)创建一个Bean
- application(Web环境)
- 整个Web应用(ServiceContext)一个实例
总结
- singleton:单例,默认,全局一个
- prototype:多例,每次获取都新建
- request、session、application(仅Web环境)
5.Spring Boot 自动配置原理(简单说就行)
- 启动类上的
@SpringBootApplication,里面包含@EnableAutoConfiguration - 它会去读取 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 里的自动配置类
- 根据 @Conditional 条件注解(比如有没有对应类、有没有 Bean)判断是否需要装配
- 满足条件就自动创建 Bean,完成配置,不用手动写 XML 或大量配置类
一句话总结:按条件自动加载配置类,帮你自动创建 Bean,省去手动配置。
6.@SpringBootApplication 里面有什么
@SpringBootApplication本质是三个注解的合体
@SpringBootApplication
= @Configuration
+ @ComponentScan
+ @EnableAutoConfiguration
分别干什么
1.@Configuration
声明当前类式配置类,Spring会扫描他
2.@ComponentScan
自动扫描当前包及子包下的@Controller、@Service、@Component等,创建Bean。
3.@EnableAutoConfiguration
开启自动配置,根据依赖自动配装需要的Bean(如MVC、数据源、Redis等)
总结
@SpringBootApplication=配置类+包扫描+自动配置,一键启动SpringBoot
7.@Controller、@RestController、@Service、@Repository 区别
- @Controller
- 标识控制器层
- 返回页面(视图),或北河@ResponseBody返回JSON
- 用于传统MVC、前后不分离项目
- @RestController
- =@Controller+@ResponseBody
- 标识REST接口控制器
- 所有方法默认返回JSON,不返回页面
- 前后端分离项目专用
- @Service
- 标识业务逻辑层(Service)
- 处理业务、事务、逻辑判断
- @Repository
- 标识数据访问层(Dao/Mapper)
- 操作数据库
- 会把数据库异常转为Spring的DataAccessException
总结
- 页面/接口控制:@Controller
- 接口只返回JSON:@RestController
- 业务逻辑:@Service
- 数据库操作:@Repository
8.@Autowired 和 @Resource 区别
- 来源不同
- @Autowired:Spring自带
- @Resource:Java官方(JSR-250)
- 默认注入方式不同
- @Autowired:按类型(byType)注入,类型多个时再按名字匹配
- @Resource:按名字(byName)优先,名字找不奥再按类型
- 是否必须注入
- @Autowired可以用required-false表示非必须
- @Resource没有这个属性
- 配合名字使用
- @Autowired + @Qualifier("beanName")指定名字
- @Resource(name="beanName")直接指定名字
总结
@Autowired先按类型,@Resource先按名字;前者Spring专属,后者Java标准。