Spring Bean生命周期共分10个步骤,简述如下:
1.实例化:实例化一个Bean
2.注入:按照Spring上下文对实例化的Bean进行依赖注入
7.初始化:自动调用init-method初始化方法
//此处就是项目中使用的bean
10.销毁:当bean不再需要时,执行销毁方法destroy-method
专业解释,参考文档如下:(后处理bean)
https://blog.csdn.net/fuzhongmin05/article/details/73389779
https://www.jianshu.com/p/3944792a5fff
两个注解都可以完成依赖注入功能。
IoC:Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。Ioc意味着将你设计好的对象交给容器控制,而不是new。
IoC 控制反转,指将对象的创建权,反转到Spring容器
DI:Dependency Injection 依赖注入,在Spring框架创建Bean对象时,动态的将依赖对象注入到Bean组件
IoC 控制反转,指将对象的创建权,反转到Spring容器 ,
DI 依赖注入,指Spring创建对象的过程中,将对象依赖属性通过配置进行注入
DI依赖注入不能单独存在,必须在IoC控制反转的基础上才能完成。
AOP (Aspect Oriented Programing) 称为:面向切面编程,它是一种编程思想。在程序运行的时候,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
基于代理思想,对原来目标对象,创建代理对象,在不修改原对象代码情况下,对原有业务方法进行增强 !
AOP通过生成代理对象,对目标类进行增强。
在spring aop中,代理对象,将通知和切入点连接在了一起,从而实现增强的过程。
代理模式:分为静态代理、JDK动态代理、cglib代理
1.静态代理
代理类和被代理类实现共同的接口(或继承),代理类中存有指向被代理类的引用,实际执行时通过调用代理类的方法、实际执行的是被代理类的方法。
2.jdk动态代理:必须有接口和实现类(目标类),通过工具类Proxy生产接口对应的代理类,从而对目标类进行增强。
3.Cglib代理:Cglib代理生成的代理类是目标类的子类,所以目标类不能使用final修饰。
AOP
Spring AOP通过代理的方式,对目标类进行增强。
Spring aop底层默认使用JDK动态代理,通过配置可以修改成cglib代理。
1.事务
2.日志处理
3.缓存
4.权限控制
5.错误处理
6.懒加载
链接:http://blog.sina.com.cn/s/blog_7045cb9e01010a9r.html
https://blog.csdn.net/qq513165077/article/details/78288999
1.单例设计模式:spring 容器中 bean默认是单例的。
2.工厂模式:BeanFactory,是spring管理bean的核。
3.代理模式:AOP通过代理对目标类进行增强;
4.适配器模式:将一个类的接口变换成客户所期待的另一种接口,从而使原本不匹配而无法一起工作的俩个类能够在一起工作;SpringMVC中的适配器HandlerAdatper,HandlerAdatper根据不同的handler规则执行不同的handler;
5.模板方法模式:父类定义了骨架(调用哪些方法及顺序),某些特定方法由子类实现;在Spring的 JdbcTemplate,RestTemplate, JmsTemplate等地方使用了模板方法模式;
参考:https://blog.csdn.net/z69183787/article/details/65628166
线程安全产生的原因是,多个线程对共享数据同时进行修改。
该问题分以下俩种情况:
1.Spring组件扫描:
在spring的配置类中使用@ComponentScan(basePackages = “com.czxy”)可以扫描com.czxy包以及子包下添加了指定注解的类。
常见的注解有: @Component、@Service、@Controller、@Repository
2.SpringBoot扫描机制
1)默认扫描规则,SpringBoot中会自动扫描启动类所在包及其子包中的所有添加了指定注解类
2)使用@ComponentScan注解可以覆盖默认扫描规则。
自动装配,自动完成各个bean之间的依赖关系装配。
Spring提供了5中自动装配模式:
1.在指定类中添加指定注解,配置类添加@ComponentScan注解进行包扫描,就可以完成bean的配置。
2.相关注解
@Component 通用组件类
@Controller 用于配置web层的controller类
@Service 用于配置service层的service类
@Repository 用于配置dao层dao类
@Bean 用于配置第三方实例,只能修饰方法。
参考:
https://www.aliyun.com/jiaocheng/812869.html
事务就是业务中的一组操作,要么全部成功,要么全部失败
Spring通过平台事务管理器(PlatformTransactionManager)进行事务管理
事务管理器通过事务定义(TransactionDefinition)进行具体的事务操作。
事务定义通过4方面对事务进行详细描述
1.readOnly:是否只读
2.timeout:超时时间
3.isolationLevel:事务隔离级别,隔离级别4种:读未提交、读已提交、可重复读、串行化
4.propagationBehavior:传播行为,共7种,常见的有:必须有事务 PROPAGATION_REQUIRED、每次必须新的 PROPAGATION_REQUIRES_NEW
Spring事务管理高层抽象主要包括3个接口,Spring的事务主要是由他们共同完成的:
PlatformTransactionManager:事务管理器—主要用于平台相关事务的管理
TransactionDefinition: 事务定义信息(隔离、传播、超时、只读)—通过配置确定如何进行事务管理。
TransactionStatus:事务具体运行状态—事务管理过程中,每个时间点事务的状态信息。
有异常就会回滚
可以通过@Transactional(rollbackFor=Exception.class,notRollbackFor=RunTimeException.class)修改默认行为
rollbackFor用于设置那些异常将发生回滚
notRollbackFor用于设置那些异常不会发生回滚
DEFAULT(默认):使用后端数据库默认的隔离级别(spring中的的选择项)
READ_UNCOMMITED(读未提交):允许你读取还未提交的改变了的数据。可能导致脏、幻、不可重复读
READ_COMMITTED(读已提交):允许在并发事务已经提交后读取。可防止脏读,但幻读和 不可重复读仍可发生
REPEATABLE_READ(可重复读):对相同字段的多次读取是一致的,除非数据被事务本身改变。可防止脏、不可重复读,但幻读仍可能发生。
SERIALIZABLE(串行化):完全服从ACID的隔离级别,确保不发生脏、幻、不可重复读。这在所有的隔离级别中是最慢的,它是典型的通过完全锁定在事务中涉及的数据表来完成的。
IOC容器就是具有依赖注入功能的容器,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。应用程序无需直接在代码中new相关的对象,应用程序由IOC容器进行组装。在Spring中BeanFactory是IOC容器的实际代表者。
1.减少代码的耦合,可以使应用更加模块化
2.增加代码的复用率
3.资源更加统一管理
4.维护代码更加方便,一般只需要修改一下配置文件就ok了。
5.提升了程序的测试性
链接:https://www.imooc.com/article/35099
1.实例化Bean对象:服务器启动时,初始化spring容器,创建由XML配置或添加了相应注解的类的实例,并将实例保存到Spring容器中;
2.完成ID操作:通过XML描述或对应注解,完成对象之间的依赖关系,此过程称为依赖注入,spring支持3种注入实现:
①注解注入:通过注解显示注入。常用注解@Resource。
②XML注入:通过xml显示注入。
③自动注入:隐式进行bean搜索并自动装配
在web项目中配置Spring的Ioc容器其实就是创建web应用的上下文(WebApplicationContext)
1.如果使用Spring Boot,默认扫描启动类所在包以及子包,启动完成上下文对象创建完成。
2.使用注解的普通web项目,需要在配置类中使用@ComponentScan确定扫描包位置,启动完成上下文对象创建完成。
3.使用xml的普通web项目,需要在web.xml配置初始化参数确定xml文件位置,从而确定加载的内容,启动完成上下文对象创建完成。
参考:
http://www.cnblogs.com/qf123/p/8488404.html
描述切面必须先了解以下几个概念:
1.目标类:需要被增强的类。
2.连接点:可能被增强的点,目标类中的所有方法。
3.切入点:将会被增强的连接点,目标类中被增强的方法。
4.通知/增强:对切入点增强的内容。增强的内容通常以方法的形式体现的。增强执行的位置不同,称呼不同。
(前置通知、后置通知、环绕通知、抛出异常通知、最终通知)
通知方法所在的类,通常称为切面类。
5.切面:通知和切入点的结合。一个通知对应一个切入点就形成一条线,多个通知对应多个切入点形成多条线,多条线形成了一个面,我们称为切面。
通知:对切入点增强的内容。增强的内容通常以方法的形式体现的。
在spring中根据增强执行位置的不同,将通知分成以下5种:
1.前置通知(before):在一个方法执行前被调用。
2.后置通知(after-returning):仅当方法成功完成后执行的通知。
3.环绕通知(around):在方法执行之前和之后调用的通知。
4.抛出异常通知(after-throwing):在方法抛出异常退出时执行的通知。
5.最终通知(after): 在方法执行之后调用的通知,无论方法执行是否成功。
实现细节,方便理解
try{
//1 前置通知
// 目标方法
//2 后置通知
} catch(){
//4 抛出异常通知
} finally{
//5 最终通知
}
在说切入点前,需要先说连接点
连接点:可能被增强的点,目标类中的所有方法。
切入点:将会被增强的连接点,目标类中被增强的方法。
目标类:需要被增强的类。
使用"横切"技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。
业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。
横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。
AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。
参考:https://www.cnblogs.com/hongwz/p/5764917.html
IoC控制反转:指将对象的创建权,反转到Spring容器
方式1:创建工厂
创建一个工厂,用于创建目标对象,就是最简单的IoC。但工厂和目标类耦合。
方式2:工厂 + 配置文件
1)配置文件中存放类的全限定名称
2)编写工厂,用于读取配置文件中的内容,并通过反射创建对象。
问题:工厂只能生产一个对象
方式3:工厂 + properties文件
1)properties配置文件存放一组,key是标识,value是全限定名称
2)编写工厂类,读取配置文件
3)提供getBean( name ) 用于生成实例:通过name获得对应的全限定名称,再通过反射创建对应的实例。