@Component
:通用的注解,可标注任意类为 Spring
组件。
@Respository
:对应Dao层/Mapper层
@Service
:对应业务层
@Controller
:对应控制层
@Autowired
是 Spring 提供的注解,@Resource
是 JDK 提供的注解。Autowire
默认注入方式时byType, Resource
默认注入方式是byName@Autowired
和@Resource
都需要通过名称才能正确匹配到对应的 Bean。Autowired
可以通过 @Qualifier
注解来显式指定名称,@Resource
可以通过 name
属性来显式指定名称@Autowired
支持在构造函数、方法、字段和参数上使用。@Resource
主要用于字段和方法上的注入,不支持在构造函数或参数上使用。singleton : IoC 容器中只有唯一的 bean 实例。Spring 中的 bean 默认都是单例的,是对单例设计模式的应用。
prototype : 每次获取都会创建一个新的 bean 实例。也就是说,连续 getBean()
两次,得到的是不同的 Bean 实例。
request (仅 Web 应用可用): 每一次 HTTP 请求都会产生一个新的 bean(请求 bean),该 bean 仅在当前 HTTP request 内有效。
session (仅 Web 应用可用) : 每一次来自新 session 的 HTTP 请求都会产生一个新的 bean(会话 bean),该 bean 仅在当前 HTTP session 内有效。
application/global-session (仅 Web 应用可用):每个 Web 应用在启动时创建一个 Bean(应用 Bean),该 bean 仅在当前应用启动时间内有效。
websocket (仅 Web 应用可用):每一次 WebSocket 会话产生一个新的 bean。
ThreadLocal
成员变量,将可变的成员变量保存在ThreadLocal
中
- 启动容器:加载Bean
- 实例化Bean对象
- 依赖注⼊:装配Bean的属性
- 初始化Bean:执⾏aware接⼝⽅法、预初始化⽅法、初始化⽅法、后初始化⽅法
- 关闭容器:销毁Bean
IOC是指控制反转,Java开发中对象的创建和管理交给IOC容器,需要哪个对象,直接从容器里面去取,不需要手动new一个对象。
最常见的实现方式为依赖注入(DI)
AOP是指面向切面编程,是将那些公共的逻辑或责任从业务代码中封装起来,形成一个个切面以减少重复代码,降低耦合度,通过动态代理实现
@Transaction
注解来实现@Transaction
注解后,spring会基于这个类生成一个代理对象,将这个代理对象作为bean,当使用这个代理对象的方法时,若有事务处理,会先关闭事务的自动提交,然后去执行具体的业务逻辑,执行过程中没有异常,则代理逻辑会直接提交,若出现异常,则会根据需要去进行回滚操作。spring事务的原理是AOP,进行了切面增强,失效的根本原因是这个AOP不起作用了。
@Transactional
只能用在public
的方法上。spring
管理循环依赖:两个或两个以上的bean互相持有对方,最终形成闭环。
一级缓存+二级缓存解决普通对象的循环依赖
一级缓存:单例池,缓存已经经历了完整的生命周期,已经初始化完成的bean对象
二级缓存:缓存早期的bean对象,尚未装配属性(生命周期还没走完)
三级缓存:缓存的是ObjectFactory,表示对象工厂,用来创建某个对象的
1、用户发送出请求到前端控制器DispatcherServlet,这是一个调度中心
2、DispatcherServlet收到请求调用HandlerMapping(处理器映射器)。
3、HandlerMapping找到具体的处理器(可查找xml配置或注解配置),生成处理器对象及处理器拦截器(如果有),再一起返回给DispatcherServlet。
4、DispatcherServlet调用HandlerAdapter(处理器适配器)。
5、HandlerAdapter经过适配调用具体的处理器(Handler/Controller)。
6、Controller执行完成返回ModelAndView对象。
7、HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet。
8、DispatcherServlet将ModelAndView传给ViewReslover(视图解析器)。
9、ViewReslover解析后返回具体View(视图)。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户。
前后端分离,没有视图这些,一般都是handler中使用Response直接结果返回
在SpringBoot项目的启动类上有一个注解@SpringBootApplication,它对@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan三个注解进行了封装。
@EnableAutoConfiguration是实现自动配置的核心注解,它内部就是读取项目对应的jar包的classpath下的spring.factories文件中的所配置的类的全类名。在这些配置类中所定义的bean会根据条件注解@ConditionalOnxx
所指定的条件来决定是否将其导入到容器中;
条件判断会有@ConditionalOnClass这样的注解,判断是否有对应的class文件,有则加载该类,把这个配置类的bean放入容器。
延迟加载:需要用到数据时才进行加载,不需要数据时就不加载
在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false,默认是关闭的
延迟加载在底层主要使用的CGLIB动态代理完成的
第一是,使用CGLIB创建目标对象的代理对象,这里的目标对象就是开启了延迟加载的mapper
第二个是当调用目标方法时,进入拦截器invoke方法,发现目标方法是null值,再执行sql查询
第三个是获取数据以后,调用set方法设置属性值,再继续查询目标方法,就有值了