spring学习笔记

1、什么是spring

spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架

2、对aop的理解

将程序中的交叉业务逻辑(比如安全、日志、事务),封装成一个切面,然后注入到目标对象中去,AOP可以对某个对象或某些对象的功能进行增强,比如对象中的方法进行增强,可以在执行某个方法前后做一些事情

3、对IOC的理解

IOC容器:将初始化后的bean放在spring容器中统一管理
控制反转:没有引入IOC之前,需要我们主动去new一个对象来使用,控制权在使用者。引入IOC容器后,bean对象是IOC统一管理的,控制权在IOC容器
依赖注入:IOC容器在运行期间,动态的将某种依赖关系注入到对象当中

4、Spring bean的生命周期

1、实例化bean对象(通过构造方法或者工厂方法)
2、设置对象属性(setter等)(依赖注入)
3、如果Bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean的ID。(和下面的一条均属于检查Aware接口)
4、如果Bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身
5、将Bean实例传递给Bean的前置处理器的postProcessBeforeInitialization(Object bean, String beanname)方法
6、调用Bean的初始化方法
7、将Bean实例传递给Bean的后置处理器的postProcessAfterInitialization(Object bean, String beanname)方法
8、使用Bean
9、容器关闭之前,调用Bean的销毁方法

5、beanfactory和applicationContext有什么区别

BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。其中ApplicationContext是BeanFactory的子接口。
(1)BeanFactory:是Spring里面最底层的接口,包含了各种Bean的定义,读取bean配置文档,管理bean的加载、实例化,控制bean的生命周期,维护bean之间的依赖关系。ApplicationContext接口作为BeanFactory的派生,除了提供BeanFactory所具有的功能外,还提供了更完整的框架功能:
①继承MessageSource,因此支持国际化。
②统一的资源文件访问方式。
③提供在监听器中注册bean的事件。
④同时加载多个配置文件。
⑤载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层。

(2)①BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化。这样,我们就不能发现一些存在的Spring的配置问题。如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常。
②ApplicationContext,它是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以发现Spring中存在的配置错误,这样有利于检查所依赖属性是否注入。ApplicationContext启动后预载入所有的单实例Bean,通过预载入单实例bean ,确保当你需要的时候,你就不用等待,因为它们已经创建好了。
③相对于基本的BeanFactory,ApplicationContext 唯一的不足是占用内存空间。当应用程序配置Bean较多时,程序启动较慢。
(3)BeanFactory通常以编程的方式被创建,ApplicationContext还能以声明的方式创建,如使用ContextLoader。
(4)BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册。

6、Spring支持的bean作用域

(1)singleton:默认,每个容器中只有一个bean的实例,单例的模式由BeanFactory自身来维护。
(2)prototype:为每一个bean请求提供一个实例。
(3)request:为每一个网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
(4)session:与request范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。
(5)global-session:全局作用域,global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。全局作用域与Servlet中的session作用域效果相同。

7、Spring框架中的单例Beans是线程安全的么

Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定。但实际上,大部分的Spring bean并没有可变的状态(比如Serview类和DAO类,没有共享变量),所以在某种程度上说Spring的单例bean是线程安全的。如果你的bean有多种状态的话(比如 View Model 对象),就需要自行保证线程安全。最浅显的解决办法就是将多态bean的作用域由“singleton”变更为“prototype”。

8、Spring 框架中都用到了哪些设计模式?

(1)工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
(2)单例模式:Bean默认为单例模式。
(3)代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
(4)模板方法:用来解决代码重复的问题。比如.RestTemplate,JmsTemplate,JpaTemplate。
(5)观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现–ApplicationListener。
(6)spring框架resource接口访问底层资源

9、spring事务的实现方式和实现原理

①编程式事务管理使用TransactionTemplate。
②通过@Transactional注解的方式。声明式事务管理建立在AOP之上的。其本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
Spring中的隔离级别:
①ISOLATION_DEFAULT:这是个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。
②ISOLATION_READ_UNCOMMITTED:读未提交,允许另外一个事务可以看到这个事务未提交的数据。
③ISOLATION_READ_COMMITTED:读已提交,保证一个事务修改的数据提交后才能被另一事务读取,而且能看到该事务对已有记录的更新。
④ISOLATION_REPEATABLE_READ:可重复读,保证一个事务修改的数据提交后才能被另一事务读取,但是不能看到该事务对已有记录的更新。
⑤ISOLATION_SERIALIZABLE:一个事务在执行的过程中完全看不到其他事务对数据库所做的更新。

10、spring的事务传播机制

spring事务的传播行为说的是,当多个事务同时存在的时候,spring如何处理这些事务的行为。
① PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。
② PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。
③ PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
④ PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
⑤ PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
⑥ PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
⑦ PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。

11、spring中的事务什么时候会失效

1、发生自调用,类里面使用this调用本类的方法(this通常省略),此时这个this不是代理对象,而是UserService类本身,所以失效。
解决办法很简单,让this变成UserService的代理类即可。(即从spring的IOC容器中取出对象)
2、方法不是public的
@Transaction只能用于public的方法上,否则事务会失效,如果要用在非public上,可以开启AspectJ代理模式
3、数据库不支持事务 (Mysql的Myisam引擎)
4、没有被spring管理
5、异常被吃掉,事务不会回滚。

12、spring自动装配的几种方式

byName 根据id/name
byType 根据类名
constructor 根据构造参数
no 人工指定(默认)通过配置文件ref手动装配

13、@autowired和@resource注解的区别是什么?

区别:1、@Autowired注解由Spring提供,只按照byType注入;@resource注解由J2EE提供,默认按照byName自动注入。
2、@Autowired默认按类型进行装配,@Resource默认按照名称进行装配。

13、spring、springmvc、springboot的区别

spring是一个ioc容器,用来管理bean,使用依赖注入实现控制反转,
springmvc是spring对web框架的一个解决方案
springboot是一个快速开发工具包,简化了配置,整合了一系列的解决方法(starter)可以更方便快速的开发spring+springmvc应用

14、spring的核心注解是哪个?它由哪几个注解组成?

核心注解:@SpringBootApplication,标注于启动类
组成:@SpringBootConfiguration----类似于spring的@Configuration注解,将启动类注入到spring容器管理
@EnableAutoConfiguration----开启自动配置,会在项目依赖包中扫描spring.factories文件中的配置,并加载这些配置 详解
@ConponentScan----扫描spring组件。即扫描对应路径下标注了@Controller、@Service等注解,创建这些类的实例,通过容器统一维护

15、springboot自动配置原理 (@EnableAutoConfiguration详细解释)

1、自动配置加载的是自动配置类,使用@Configuration+@bean定义配置类,放在META-INF/spring.factories资源文件中
2、EnableAutoConfiguration中通过@Import注解引入了@Import(AutoConfigurationImportSelector.class)类
3、在AutoConfigurationImportSelector类中,会去扫描所有依赖包中的spring.factories配置文件,加载配置文件中所有key为org.springframework.boot.autoconfig.EnableAutoConfiguration的配置类

源码调用链路
EnableAutoConfiguration注解会通过@import注解将AutoConfigurationImportSelector类注入到容器管理;  
spring在调用后置处理器方式时,会调用到AutoConfigurationImportSelector的getCandidateConfigurations方法  
该方法中会去调用SpringFactoriesLoader.loadFactoryNames方法
在loadFactoryNames方法中会去加载所有路径为META-INF/spring.factories的资源文件,并存储在MultiValueMap中
在类ConfigurationClassParser中,调用processGroupImports方法将这些配置类加载到容器
16、如何理解springboot中的starter机制

使用springboot的自动配置机制。所谓starter就是定义一个starter的jar包,写一个@Configuration的配置类,将框架需要的bean定义在里面,然后在starter包的META-INF/spring.factories文件中写入该配置类,spring自动配置时就会按照约定来加载该配置类。这样就通过starter实现了快速配置开发

17、springboot定义的条件注解

@ConditionalOnClass : classpath中存在该类时起效
@ConditionalOnMissingClass : classpath中不存在该类时起效
@ConditionalOnBean : DI容器中存在该类型Bean时起效
@ConditionalOnMissingBean : DI容器中不存在该类型Bean时起效
@ConditionalOnSingleCandidate : DI容器中该类型Bean只有一个或@Primary的只有一个时起效
@ConditionalOnExpression : SpEL表达式结果为true时
@ConditionalOnProperty : 参数设置或者值一致时起效
@ConditionalOnResource : 指定的文件存在时起效
@ConditionalOnJndi : 指定的JNDI存在时起效
@ConditionalOnJava : 指定的Java版本存在时起效
@ConditionalOnWebApplication : Web应用环境下起效
@ConditionalOnNotWebApplication : 非Web应用环境下起效

18、aop支持的两种代理方式,何时使用jdk动态代理,何时使用cglib动态代理
  • 如果目标对象实现了接口,默认情况下会采用DJK的动态代理实现AOP
  • 如果目标对象实现了接口,可以强制使用cglib动态代理实现AOP
  • 如果目标对象没有实现接口,必须采用cglib库,spring会自动在JDK动态代理和CGLIB之间转换
20、springboot配置文件优先级加载顺序

file:./config/ - 优先级最高(项目根路径下的config)
file:./ - 优先级第二 -(项目根路径下)
classpath:/config/ - 优先级第三(项目resources/config下)
classpath:/ - 优先级第四(项目resources根目录)

19、aop相关术语
- 切面(advisor):通常是一个类,里面可以定义切入点和通知  
- 切点(pointcut):带有通知的连接点,程序中体现为书写切入点表达式  
- 连接点(joinpoint):程序执行过程中明确的点,一般是方法的调用。被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器  
- 通知、增强(advice):AOP在特定的切入点上执行的增强处理,有before(前置),after(后置),afterReturning(最终),afterThrowing(异常),around(环绕)  
- 目标对象(target):包含连接点的对象。也被称作被通知或被代理对象。POJO  
- 织入(weaving):将切面应用到目标对象并导致代理对象创建的过程
- 引入(introduction):在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段
- 代理(proxy):AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类
- 横切关注点:对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
20、aop织入方式
  • 编译时织入:需要特殊的编译期,如AspectJ
  • 类加载时织入:需要特殊的类加载器,如ClassLoader
  • 运行时织入:spring采用动态代理的方式实现运行时织入,如springaop
21、aop通知类型

前置通知(before advice)
–在目标方法被调用之前做增强处理,@Before只需要指定切入点表达式即可
后置通知(after advice)
–在目标方法完成之后做增强,无论目标方法时候成功完成。@After可以指定一个切入点表达式
环绕通知(Around advice)
–环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知,注意编程中核心是一个ProceedingJoinPoint
异常通知(throws advice)
–主要用来处理程序中未处理的异常,@AfterThrowing除了指定切入点表达式后,还可以指定一个throwing的返回值形参名,可以通过该形参名来访问目标方法中所抛出的异常对象
返回通知(introduction advice)
–在目标方法正常完成后做增强,@AfterReturning除了指定切入点表达式后,还可以指定一个返回值形参名returning,代表目标方法的返回值

22、aop使用场景

Authentication 权限
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 懒加载
Debugging  调试
logging, tracing, profiling and monitoring 记录跟踪 优化 校准
Performance optimization 性能优化
Persistence  持久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务

23、execution表达式范例

规范写法:execution(* com.baizhi.service.UserServiceImpl.*(…))重点 最通用的 //执行接口下的所有接口方法

1、execution(): 表达式主体。
2、第一个*号:方法返回类型, 号表示所有的类型。
3、包名:表示需要拦截的包名。
4、第二个
号:表示类名,号表示所有的类。
5、
(…):最后这个星号表示方法名,*号表示所有的方法,后面( )里面表示方法的参数,两个句点表示任何参数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值