@Service、@Repository、@Component、@Autowired、@Transactional
@Autowired默认时根据类型注入的(bytype),@Resouce默认时根据设置的名称注入的(byname)
2.自定义注解应用场景
检验(统一登录校验)
日志(解耦)
是否启动动态数据
读写分离
是否实现策略模式
统一操作
固定传递参数(是否必传、正则校验)
1.首先容器启动后,会对scope为singleton且非懒加载的bean进行实例化,
2.按照Bean定义信息配置信息,注入所有的属性
3.如果Bean实现了BeanNameAware接口,会回调该接口的setBeanName()方法,传入该Bean的id,此时该Bean就获得了自己在配置文件中的id,
4.如果Bean实现了BeanFactoryAware接口,会回调该接口的setBeanFactory()方法,传入该Bean的BeanFactory,这样该Bean就获得了自己所在的BeanFactory,
5.如果Bean实现了ApplicationContextAware接口,会回调该接口的setApplicationContext()方法,传入该Bean的ApplicationContext,这样该Bean就获得了自己所在的ApplicationContext
6.如果有Bean实现了BeanPostProcessor接口,则会回调该接口的postProcessBeforeInitialzation()方法(重要,Spring 的 AOP 就是利⽤它实现的。)
7.如果Bean实现了InitializingBean接口,则会回调该接口的afterPropertiesSet()方法,
8.如果Bean配置了init-method方法,则会执行init-method配置的方法,
9.如果有Bean实现了BeanPostProcessor接口,则会回调该接口的postProcessAfterInitialization()方法
10.经过流程9之后,就可以正式使用该Bean了,对于scope为singleton的Bean,Spring的ioc容器中会缓存一份该bean的实例,而对于scope为prototype的Bean,每次被调用都会new一个新的对象,期生命周期就交给调用方管理了,不再是Spring容器进行管理了
11.容器关闭后,如果Bean实现了DisposableBean接口,则会回调该接口的destroy()方法
12.如果Bean配置了destroy-method方法,则会执行destroy-method配置的方法,至此,整个Bean的生命周期结束
IOC、AOP(知识点延伸相关代码原理,应用场景)?
IOC缺点?
反射对象机制,实例化对象
(对性能有一定影响,创建对象过程变得复杂)
IOC使用到的设计模式
工厂模式:通过 BeanFactory或ApplicationContext创建 bean 对象
单例模式:bean的默认作用域就是singleton(单例)的
观察者模式:Spring 的Event事件驱动模型就是观察者模式
装饰者模式:Spring的Wrapper相关的类使用到了装饰者模式
策略模式:Spring的Bean初始化的Strategy相关的类使用到了策略模式
AOP使用到的设计模式
代理模式:如果被代理类实现了接口,使用JDK动态代理,否则使用Cglib动态代理
适配器模式:AOP的Advice(通知)使用到了适配器模式
springMVC、spring、spring-boot、spring-cloud区别?
Spring基础平台,提供了IOC和AOP等基础能力,还提供众多框架的整合能力
Spring MVC是Spring的一部分,依托Spring的基础能力提供了Web支持能力
Spring Boot是为了简化Spring的开发,提供了自动装配能力,可以简化配置和依赖管理,开箱即用
Spring Cloud以Spring Boot为基础,提供了众多组件,可以快速开发分布式微服务应用
Spring Cloud Netflix组件
Zuul:网关组件,是微服务的入口,提供了过滤,认证,路由转发等重要能力,性能稍差
Eureka: 注册中心,提供了服务注册,服务发现等服务管理能力,AP保证强一致性
Ribbon: 负载均衡组件,内置多个负载算法提供了服务节点的负载调用能力
Hystrix: 熔断器,提供了服务熔断,服务降级等服务保护于请求兜底能力
Feign: 接口调用,以HTTP的方式提供了服务接口的暴露与调用,相比RPC性能稍差
Spring Cloud 官方组件
Spring Cloud GateWay: 网关组件,相比Zuul,还提供了WebFlux支持
Spring Cloud Config: 配置中心,将配置与应用解耦,统一管理,方便维护
Spring Cloud OpenFeign: 增强接口调用,整合了Ribbon,Hystrix和Feign,并可以使用SpringMVC注解
Spring Cloud Alibaba组件
Nacos: 注册中心与配置中心,提供了服务注册,服务发现,配置管理等功能,同时支持CP与AP
Seata: 分布式事务组件,解决分布式微服务调用链的事务问题,但是seata会造成数据的脏读
Sentinel: 流量哨兵,与Hystrix相似,除熔断降级外,还提供流量控制、系统负载保护等功能
JPA全称Java Persistence API,是Java提供的一套持久层规范,不是具体的实现方案
Hibernate是一个实现了JPA的规范ORM框架,提供了对象与关系表的映射
Spring Data JPA是Spring定义的封装了JPA规范的更加简单持久层规范,具体实现依赖Hibernate框架,相比直接使用Hibernate,Spring Data JPA更加简单
Hibernate是对象与关系表的映射,可以用面向对象的方式完成数据库操作
Spring Data JPA可以用更简单的方式使用Hibernate,同时也可以更方便写原生SQL语句
Mybatis是一个轻量级的持久层框架,入门容易,需要编写原生SQL语句
技术选型考虑要点:是否快速开发(jpa)、上手程度(mybatis)、jpa自动生成表、是否切换数据库(hibernate、jpa)
Mybatis #和 $区别
#采用预处理带有占位符防止sql注入
其中${}比较特殊,他的应用场景是需要动态传入表名或列名时使用