Spring框架知识汇总
2021-08-24 09:47:55 48 举报
AI智能生成
Spring框架知识汇总
作者其他创作
大纲/内容
Spring介绍
Spring项目的搭建
搭建方式
手动创建
使用手动加载jar包的方式实现,<br>分为三个步骤,现在几乎不用
导包:导入这五个包即可<br>
写配置<br>
创建bean对象
在ioc.xml文件中注册对象信息
测试
maven创建
创建maven项目
配置pom.xml中依赖,<br>定义项目的groupId、artifactId
编写代码--创建bean对象
测试
搭建spring项目需要注意的点
1、一定要将配置文件添加到类路径中,<br>使用idea创建项目的时候要放在resource目录下<br>
2、导包的时候别忘了commons-logging-1.2.jar包<br>
细节点
1、ApplicationContext就是IOC容器的接口,可以通过此对象获取容器中创建的对象<br>
2、对象在Spring容器创建完成的时候就已经创建完成,不是需要用的时候才创建<br>
3、对象在IOC容器中存储的时候都是单例的,如果需要多例需要修改属性
4、创建对象给属性赋值的时候是通过setter方法实现的
5、对象的属性是由setter/getter方法决定的,而不是定义的成员属性<br>
?
Spring IOC的配置使用
ioc.xml配置
Spring对象的获取及属性赋值方式<br>
1.通过bean的id获取IOC容器中的对象<br>
ApplicationContext context = new ClassPathXmlApplicationContext("ioc.xml");<br> Person person = (Person) context.getBean("person");<br>
2.通过bean的类型获取对象
ApplicationContext context = new ClassPathXmlApplicationContext("ioc.xml");<br> Person bean = context.getBean(Person.class);
通过bean的类型在查找对象的时候,在配置文件中不能存在两个类型一致的bean对象,<br>如果有的话,可以通过如下方法:Person person = context.getBean("person", Person.class);
3.通过构造器给bean对象赋值<br>
详细
4.通过命名空间为bean赋值,<br>简化配置文件中属性声明的写法
详细
5.为复杂类型进行赋值操作
详细
6.继承关系bean的配置
详细
7、bean对象创建的依赖关系
详细
8、bean的作用域控制,是否是单例
详细
9、利用工厂模式创建bean对象
之前的案例中所有bean对象的创建<br>都是通过反射得到对应的bean实例
在spring中还包含另外一种创建bean实例的方式,<br>就是通过工厂模式进行对象的创建,有两种方式<br>
静态工厂<br>
工厂本身不需要创建对象,但是可以通过静态方法调用,<br>对象=工厂类.静态工厂方法名();
详细
实例工厂
工厂本身需要创建对象,工厂类 工厂对象=new 工厂类;<br>工厂对象.get对象名();<br>
详细
10、继承FactoryBean来创建对象
详细<br>
11、bean对象的初始化和销毁方法
详细
12、配置bean对象初始化方法的前后处理方法<br>
详细
13、spring创建第三方bean对象<br>
详细
14、spring引用外部配置文件<br>
详细
5、spring基于xml文件的自动装配
详细
6、SpEL的使用<br>
详细
注解
1、使用注解的方式注册bean到IOC容器中
详细
2、定义扫描包时要包含的类和不要包含的类
详细
3、使用@AutoWired进行自动注入
详细
4、@AutoWired可以进行定义在方法上
详细
5、自动装配的注解@AutoWired,@Resource
详细
6、泛型依赖注入
详细
Spring AOP
1、AOP的概念
为什么要引入AOP?
详细
AOP的核心概念及术语
切面(Aspect)<br>
连接点(Join point)<br>
通知(Advice)<br>
切点(Pointcut)<br>
引入(Introduction)<br>
目标对象(Target object)<br>
AOP代理(AOP proxy)<br>
织入(Weaving)<br>
AOP的通知类型
前置通知(Before advice)
在连接点之前运行但无法阻止执行流程进入连接点的通知(除非它引发异常)<br>
后置返回通知(After returning advice)<br>
在连接点正常完成后执行的通知(例如,当方法没有抛出任何异常并正常返回时)<br>
后置异常通知(After throwing advice)<br>
在方法抛出异常退出时执行的通知<br>
后置通知(总会执行)(After (finally) advice)<br>
当连接点退出的时候执行的通知(无论是正常返回还是异常退出)<br>
环绕通知(Around Advice)<br>
环绕连接点的通知,例如方法调用。这是最强大的一种通知类型。<br>环绕通知可以在方法调用前后完成自定义的行为。<br>它可以选择是否继续执行连接点或直接返回自定义的返回值又或抛出异常将执行结束。<br>
AOP的应用场景
日志管理<br>
权限认证<br>
安全检查<br>
事务控制<br>
2、Spring AOP的简单配置
1.添加pom依赖<br>
2.编写配置<br>
详细
3.测试
详细
4.通过cglib来创建代理对象<br>
详细
注意点
1、切入点表达式
2、通知方法的执行顺序
3、获取方法的详细信息
详细
4、spring对通过方法的要求
详细
5、表达式的抽取
详细
6、环绕通知的使用<br>
详细
7、多切面运行的顺序<br>
详细
3、基于配置的AOP配置
详细
Spring AOP的高级应用配置<br>
1、Spring JdbcTemplate<br>
介绍<br>
1、配置并测试数据源<br>
详细<br>
2、给spring容器添加JdbcTemplate<br>
详细
3、插入数据<br>
详细
4、批量插入数据<br>
详细
5、查询某个值,并以对象的方式返回<br>
详细
6、查询返回集合对象
详细
7、返回组合函数的值<br>
详细
8、使用具备具名函数的JdbcTemplate<br>
详细
9、整合EmpDao<br>
详细
2、声明式事务
1、环境准备<br>
详细
2、声明式事务的简单配置
详细
3、事务配置的属性<br>
详细
4、测试超时属性<br>
详细
5、设置事务只读<br>
详细
6、设置哪些异常不回滚<br>
详细
7、设置哪些异常回滚<br>
详细
8、设置隔离级别<br>
详细
9、事务的传播特性<br>
详细
10、测试事务的传播特性
详细
3、基于xml的事务配置
详细
Spring源码分析-原理
1、什么是Spring框架,<br>Spring框架主要包含哪些模块<br>
说明
包含的模块
2、Spring框架的优势
1、Spring通过DI、AOP和消除样板式代码来简化企业级Java开发<br>
2、Spring框架之外还存在一个构建在核心框架之上的庞大生态圈,它将Spring扩展到不同的领域,如Web服务、REST、移动开发以及NoSQL<br>
3、低侵入式设计,代码的污染极低<br>
4、独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺<br>
5、Spring的IoC容器降低了业务对象替换的复杂性,提高了组件之间的解耦<br>
6、Spring的AOP允许将一些通用任务如安全、事务、日志等进行集中式处理,从而提供了更好的复用<br>
7、Spring的ORM和DAO提供了与第三方持久层框架的的良好整合,并简化了底层的数据库访问<br>
8、Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部<br>
3、IOC和DI是什么?<br>
IOC
控制反转是就是应用本身不负责依赖对象的创建和维护,依赖对象的创建及维护是由外部容器负责的,<br>这样控制权就有应用转移到了外部容器,控制权的转移就是控制反转。
DI
依赖注入是指:在程序运行期间,由外部容器动态地将依赖对象注入到组件中如:一般,通过构造函数注入或者setter注入。<br>
4、Spring IOC容器的初始化过程<br>
第一个过程是Resource资源定位。这个Resouce指的是BeanDefinition的资源定位。<br>这个过程就是容器找数据的过程,就像水桶装水需要先找到水一样。<br>
第二个过程是BeanDefinition的载入过程。这个载入过程是把用户定义好的Bean表示成Ioc容器内部的数据结构,<br>而这个容器内部的数据结构就是BeanDefition。
第三个过程是向IOC容器注册这些BeanDefinition的过程,这个过程就是将前面的BeanDefition保存到HashMap中的过程。<br>
5、BeanFactory 和 FactoryBean的区别<br>
BeanFactory
是个Factory,也就是IOC容器或对象工厂,在Spring中,<br>所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的,提供了实例化对象和拿对象的功能。<br>
使用场景
- 从Ioc容器中获取Bean(byName or byType)<br> - 检索Ioc容器中是否包含指定的Bean<br> - 判断Bean是否为单例
FactoryBean
是个Bean,这个Bean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,<br>它的实现与设计模式中的工厂模式和修饰器模式类似。
使用场景
- ProxyFactoryBean<br>
6、BeanFactory和ApplicationContext的异同<br>
ApplicationContext类图
相同
Spring提供了两种不同的IOC 容器,一个是BeanFactory,另外一个是ApplicationContext,<br>它们都是Java interface,ApplicationContext继承于BeanFactory(ApplicationContext继承ListableBeanFactory。
它们都可以用来配置XML属性,也支持属性的自动注入。<br>
而ListableBeanFactory继承BeanFactory),BeanFactory 和 ApplicationContext 都提供了一种方式,<br>使用getBean("bean name")获取bean。<br>
不同<br>
当你调用getBean()方法时,BeanFactory仅实例化bean,而ApplicationContext 在启动容器的时候实例化单例bean,<br>不会等待调用getBean()方法时再实例化。
BeanFactory不支持国际化,即i18n,但ApplicationContext提供了对它的支持。<br>
BeanFactory与ApplicationContext之间的另一个区别是能够将事件发布到注册为监听器的bean。<br>
BeanFactory 的一个核心实现是XMLBeanFactory 而ApplicationContext 的一个核心实现是ClassPathXmlApplicationContext,<br>Web容器的环境我们使用WebApplicationContext并且增加了getServletContext 方法。<br>
如果使用自动注入并使用BeanFactory,则需要使用API注册AutoWiredBeanPostProcessor,<br>如果使用ApplicationContext,则可以使用XML进行配置。<br>
简而言之,BeanFactory提供基本的IOC和DI功能,而ApplicationContext提供高级功能,BeanFactory可用于测试和非生产使用,<br>但ApplicationContext是功能更丰富的容器实现,应该优于BeanFactory<br>
7、Spring Bean 的生命周期<br>
bean生命周期<br>
(1)实例化Bean
对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBean进行实例化。对于ApplicationContext容器,当容器启动结束后,通过获取BeanDefinition对象中的信息,实例化所有的bean。
(2)设置对象属性(依赖注入)
实例化后的对象被封装在BeanWrapper对象中,紧接着,Spring根据BeanDefinition中的信息 以及 <br>通过BeanWrapper提供的设置属性的接口完成依赖注入。
(3)处理Aware接口
接着,Spring会检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给Bean
①如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,<br>此处传递的就是Spring配置文件中Bean的id值;
②如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory()方法,传递的是Spring工厂自身。
③如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文;
(4)BeanPostProcessor
如果想对Bean进行一些自定义的处理,那么可以让Bean实现了BeanPostProcessor接口,<br>那将会调用postProcessBeforeInitialization(Object obj, String s)方法。
(5)InitializingBean 与 init-method
如果Bean在Spring配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法。<br>
(6)如果这个Bean实现了BeanPostProcessor接口
将会调用postProcessAfterInitialization(Object obj, String s)方法;由于这个方法是在Bean初始化结束时调用的,<br>所以可以被应用于内存或缓存技术;<br>以上几个步骤完成后,Bean就已经被正确创建了,之后就可以使用这个Bean了。
(7)DisposableBean
当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法
(8)destroy-method
最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。
8、Spring AOP的实现原理<br>
Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是在内存中临时为方法生成一个AOP对象,<br>这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。
Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。JDK动态代理通过反射来接收被代理的类,<br>并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类。
如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。
9、Spring 是如何管理事务的<br>
Spring事务管理主要包括3个接口,Spring的事务主要是由它们<br>(**PlatformTransactionManager,TransactionDefinition,TransactionStatus**)三个共同完成的。
1. PlatformTransactionManager
事务管理器--主要用于平台相关事务的管理
主要有三个方法:<br>- commit 事务提交;<br>- rollback 事务回滚;<br>- getTransaction 获取事务状态。
2. TransactionDefinition
事务定义信息--用来定义事务相关的属性,<br>给事务管理器PlatformTransactionManager使用
这个接口有下面四个主要方法:<br>- getIsolationLevel:获取隔离级别;<br>- getPropagationBehavior:获取传播行为;<br>- getTimeout:获取超时时间;<br>- isReadOnly:是否只读(保存、更新、删除时属性变为false--可读写,查询时为true--只读)<br>事务管理器能够根据这个返回值进行优化,这些事务的配置信息,都可以通过配置文件进行配置。
3. TransactionStatus
事务具体运行状态--事务管理过程中,每个时间点事务的状态信息。
例如它的几个方法:<br>- hasSavepoint():返回这个事务内部是否包含一个保存点,<br>- isCompleted():返回该事务是否已完成,也就是说,是否已经提交或回滚<br>- isNewTransaction():判断当前事务是否是一个新事务
声明式事务的优缺点
**优点**:不需要在业务逻辑代码中编写事务相关代码,只需要在配置文件配置或使用注解(@Transaction),这种方式没有侵入性。
**缺点**:声明式事务的最细粒度作用于方法上,如果像代码块也有事务需求,只能变通下,将代码块变为方法。
10、Spring 的不同事务传播行为有哪些,干什么用的<br>
传播特性
11、Spring 中用到了那些设计模式<br>
代理模式—在AOP中被用的比较多。
单例模式—在spring配置文件中定义的bean默认为单例模式。
模板方法—用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
工厂模式—BeanFactory用来创建对象的实例。
适配器--spring aop
装饰器--spring data hashmapper
观察者-- spring 事件驱动模型
回调--Spring Aware回调接口
12、Spring如何解决循环依赖<br>
https://blog.csdn.net/qq_36381855/article/details/79752689
13、bean的作用域<br>
(1)singleton:默认,每个容器中只有一个bean的实例,单例的模式由BeanFactory自身来维护。
(2)prototype:为每一个bean请求提供一个实例。
(3)request:为每一个网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
(4)session:与request范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。
14、Spring框架中有哪些不同类型的事件<br>
(1)上下文更新事件(ContextRefreshedEvent)
在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发。
(2)上下文开始事件(ContextStartedEvent)
当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件。
(3)上下文停止事件(ContextStoppedEvent)
当容器调用ConfigurableApplicationContext的Stop()方法停止容器时触发该事件。
(4)上下文关闭事件(ContextClosedEvent)
当ApplicationContext被关闭时触发该事件。容器被关闭时,其管理的所有单例Bean都被销毁。
(5)请求处理事件(RequestHandledEvent)
在Web应用中,当一个http请求(request)结束触发该事件。
15、Spring通知有哪些类型<br>
(1)前置通知(Before advice)
在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。
(2)返回后通知(After returning advice)
在某连接点(join point)正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回。
(3)抛出异常后通知(After throwing advice)
在方法抛出异常退出时执行的通知。
(4)后通知(After (finally) advice)
当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)
(5)环绕通知(Around Advice)
包围一个连接点(join point)的通知,如方法调用。这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。 环绕通知是最常用的一种通知类型。
16、Spring的自动装配<br>
在spring中,对象无需自己查找或创建与其关联的其他对象,<br>由容器负责把需要相互协作的对象引用赋予各个对象,<br>使用autowire来配置自动装载模式。
在Spring框架xml配置中共有5种自动装配:
(1)no:默认的方式是不进行自动装配的,通过手工设置ref属性来进行装配bean。
(2)byName:通过bean的名称进行自动装配,如果一个bean的 property 与另一bean 的name 相同,就进行自动装配。
(3)byType:通过参数的数据类型进行自动装配。
(4)constructor:利用构造函数进行装配,并且构造函数的参数通过byType进行装配。
(5)autodetect:自动探测,如果有构造方法,通过 construct的方式自动装配,否则使用 byType的方式自动装配。
基于注解的方式:
使用@Autowired注解来自动装配指定的bean。在使用@Autowired注解之前需要在Spring配置文件进行配置,<br><context:annotation-config />。在启动spring IoC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,<br>当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,<br>并装配给该对象的属性。在使用@Autowired时,首先在容器中查询对应类型的bean:
如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据;
如果查询的结果不止一个,那么@Autowired会根据名称来查找;
如果上述查找的结果为空,那么会抛出异常。解决方法时,使用required=false。
@Autowired可用于:构造函数、成员变量、Setter方法
注:@Autowired和@Resource之间的区别
(1) @Autowired默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在(可以设置它required属性为false)。
(2) @Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入。
Spring动态代理
JDK的动态代理
cglib的动态代理
说明
1、Enhancer.create()
2、Enhancer.createHelper()
3、标识代理类
1、KEY_FACTORY
2、Keyfactory_create方法
3、Generator的create方法
4、AbstractClassGenerator的create(Key)方法
5、data.get(this,getUseCache)
6、generatedClasses.get(gen)
7、AbstractClassGenerator.generate 方法
8、DefaultGeneratorStrategy.generate(ClassGenerator cg)
9、Generator.generateClass(ClassVisitor v)
4、回到步骤2,接着向下看执行的过程
5、AbstractClassGenerator.create方法
6、Enhancer.generate(ClassLoadData data)
7、Enhancer.generatorClass(ClassVisitor c)
0 条评论
下一页