Java横向技术 spring框架【笔记】

Spring 的两大特性是什么?

AOP(Aspect Oriented Programming,面向切面编程)与 IOC(Inverse of Control,控制反转)

AOP 的原理以及实现方式

Spring AOP底层使用的是动态代理,有两种实现方式:

JDK 动态代理:利用反射机制生成一个实现代理接口匿名类,在调用具体方法前调用 InvokeHandler 来处理

CGlib 动态代理:以 CGLIB(Code Generation Library)的方式进行代理,它采用底层字节码技术,将代理对象类class 文件加载进来,通过修改其字节码生成子类来处理

区别JDK 代理只能对实现接口的类生成代理CGLIB 是针对类实现代理,继承指定类并生成一个子类,因此不能代理 final 修饰的类

在 Spring 中,优先使用哪种 AOP 呢?

(1)如果目标对象实现了接口默认会采用 JDK 的动态代理,但也可以强制使用 CGLIB

(2)如果目标对象没有实现了接口,则必须采用 CGLIB 库

Spring自动在 JDK 动态代理和 CGLIB 之间转换

Spring 的 bean 的初始化及生命周期?

(1)实例化 Bean:对于 BeanFactory 容器,当向容器请求一个尚未初始化的 bean 时,或初始化 bean 的时候需要注入另一个尚未初始化 bean 的依赖时,容器就会调用 createBean 进行实例化,对于 ApplicationContext 容器,当容器启动结束后,通过获取 BeanDefinition 对象中的信息,实例化所有的 bean

(2)设置对象属性(依赖注入)实例化后的 Bean 被封装在 BeanWrapper 对象中,然后 Spring 根据 BeanDefinition 中的信息以及通过 BeanWrapper 提供的设置属性的接口完成依赖注入

(3)处理 Aware 接口:Spring 会检测该 Bean 是否实现了 xxxAware 接口,并将相关的 xxxAware 实例注入给 Bean:

如果该 Bean 实现了 BeanNameAware 接口,会调用它实现的 setBeanName 方法,入参是 Spring 配置文件中 Bean 的 id 值

如果该 Bean 实现了 BeanFactoryAware 接口,会调用它实现的 setBeanFactory 方法,传递的是 Spring 工厂自身

如果该 Bean 已经实现了 ApplicationContextAware 接口,会调用setApplicationContext方法,入参是 Spring 上下文

(4)处理 BeanPostProcessor 接口:如果该 Bean 实现了实现了 BeanPostProcessor 接口,那将会调用 postProcessBeforeInitialization (Object obj, String s) 方法

(5)InitializingBean 与 init-method:如果该 Bean 在 xml 中配置了 init-method 属性,则会自动调用其配置的初始化方法

以上几个步骤完成后,Bean 就已经被正确创建了,之后就可以使用这个 Bean 了

(6)处理 DisposableBean 接口:当 Bean 不再需要时,会经过清理阶段,如果 Bean 实现了 DisposableBean 这个接口,会调用其实现的 destroy () 方法

(7)处理 destroy-method 属性:最后,如果这个 Bean 的 Spring 配置中配置了 destroy-method 属性,会自动调用其配置的销毁方法

Spring 支持的事务管理类型有哪些?各自的优缺点?

(1)编程式事务管理:是指在代码中手动管理事务的提交回滚操作

(2)声明式事务管理:将事务管理作为一个 “切面” 代码单独编写,只用关心核心业务逻辑代码,然后通过 AOP 技术将事务管理的 “切面” 代码织入到业务类

声明式事务的缺点在于只能作用到方法级别无法做到像编程式事务那样能控制到代码块级别,其优点则在于可以将业务代码和事务管理分离,编程式事务则对业务代码侵入式太强

纯JDBC操作数据库怎么用事务?

(1)获取连接 Connection con = DriverManager.getConnection ()

(2)开启事务 con.setAutoCommit (true/false)

(3)执行增删查改

(4)提交事务 / 回滚事务 con.commit () /con.rollback ()

(5)关闭连接 conn.close ()

使用 Spring 的事务管理功能后,可以不再写步骤 2 和 4 的代码,而是由 Spirng 自动完成

spring是个啥?对spring的理解?

Spring是一个开源框架,是为解决企业应用开发复杂性而创建的,然而,Spring的用途不仅限于服务器端的开发,从简单性可测试性松耦合的角度而言,任何Java应用都可以从Spring中受益,其目的就是为了解决企业应用开发的复杂性目的

功能方面,使用基本的JavaBean代替EJB,并提供了更多的企业应用功能功能),而应用范围可以说是任何的Java应用(范围),简单来说,Spring是一个轻量级控制反转(IoC)和面向切面(AOP)容器框架简要特点

大小开销两方面而言Spring都是轻量的,完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布,并且Spring所需的处理开销也是微不足道的,此外,Spring是非侵入式的,比如Spring应用中的对象不依赖于Spring的特定类轻量的特征

Spring通过一种称作控制反转(IoC)的技术促进松耦合,当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象控制反转的特征

Spring提供了面向切面编程的丰富支持,允许通过分离应用业务逻辑系统级服务进行内聚性的开发,应用对象只实现它们的完成业务逻辑,仅此而已,它们并负责其它的系统级关注点面向切面的特点

Spring包含并管理应用对象配置生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建基于一个可配置原型,bean可以创建一个单独的实例或者每次需要时都生成一个新的实例,以及它们是如何相互关联的,然而,Spring不应该被等同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用(容器特点

Spring可以将简单的组件配置、组合成为复杂的应用,在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里,Spring也提供了很多基础功能,将应用逻辑的开发留给了使用人员(框架的特征

所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码,它们也为Spring中的各种模块提供了基础支持

使用spring框架能为企业级开发带来什么好处?

(1)非侵入式:支持基于POJO的编程模式,不强制性的要求实现Spring框架中的接口继承Spring框架中的类

(2)IoC容器:IoC容器帮助应用程序管理对象以及对象之间的依赖关系,对象之间的依赖关系如果发生了改变只需要修改配置文件而不是修改代码,因为代码的修改可能意味着项目的重新构建和完整的回归测试,有了IoC容器,程序员再也不需要自己编写工厂、单例,这一点特别符合Spring的不重复的发明轮子的精神

(3)AOP(面向切面编程):将所有的横切关注功能封装到切面中,通过配置的方式将横切关注功能动态添加到目标代码上,进一步实现了业务逻辑系统服务之间的分离,另一方面,有了AOP程序员可以省去很多自己写代理类的工作

(4)MVC:Spring的MVC框架是非常优秀的,为Web表示层提供了更好的解决方案

(5)事务管理:Spring以宽广的胸怀接纳多种持久层技术,并且为其提供了声明式的事务管理,在不需要任何一行代码的情况下就能够完成事务管理

(6)其他:可以在感觉不到Spring存在的情况下,在项目中使用Spring提供的各种优秀的功能

Spring能做什么?

Spring的主要目的是使J2EE易用和促进好编程习惯

Spring不重新开发已有的东西,因此,在Spring中你将发现没有日志记录的包,没有连接池,没有分布事务调度。这些均有开源项目提供,或由你的应用程序服务器提供

Spring的目标是使已存在的技术更加易用

Spring没有直接和其他的开源项目竞争,除非我们感到我们能提供新的一些东西,在某些领域,例如轻量级的IoC容器和AOP框架,Spring有直接的竞争,但是在这些领域还没有已经较为流行的解决方案

Spring也得益于内在的一致性

所有的开发者都在唱同样的的赞歌,基础想法依然是Expert One-on-One J2EE设计与开发的那些,并且我们已经能够使用一些主要的概念,例如倒置控制,来处理多个领域

Spring在应用服务器之间是可移植的

当然保证可移植性总是一次挑战,但是我们避免任何特定平台或非标准化,并且支持在WebLogic,Tomcat,Resin,JBoss,WebSphere和其他的应用服务器上的用户

Java 横向技术 Spring框架【笔记】的更多相关文章

  1. Java横向技术 网络【笔记】

    Java横向技术 网络[笔记] 计算机网络 服务器返回给客户端 http 响应包的状态码有哪几大类?302.304 分别是什么意思? ​ 状态码分为五大类: ​(1)信息性状态码(Informatio ...

  2. Java EE数据持久化框架笔记 • 【目录】

    章节 内容 实践练习 Java EE数据持久化框架作业目录(作业笔记) 第1章 Java EE数据持久化框架笔记 • [第1章 MyBatis入门] 第2章 Java EE数据持久化框架笔记 • [第 ...

  3. 【Java】关于Spring框架的总结 (三)

    前文对 Spring IoC 和 Spring AOP 的实现方法进行了整合.如果有不明白的或有质疑的地方可以评论出来,一起探讨问题,帮助别人也是帮助自己!本文探讨的中心主要放在 Spring 的注解 ...

  4. 【Java】关于Spring框架的总结 (一)

    本文总结一些关于Spring框架的理解,注意点及基础操作.如果有不对的地方,欢迎批评和建议.大家一起努力吧! Spring 框架简介 Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创 ...

  5. Java面试04|Spring框架

    1.动态代理的几种方式 Java主要有两种代理,JDK和Cglib动态代理.先看JDK代理实例如下: JDK创建代理有一个限制,即它只能为接口创建代理实例.举个例子如下: public interfa ...

  6. (转) Spring框架笔记(二十五)——NamedParameterJdbcTemplate与具名参数(转)

    在经典的 JDBC 用法中, SQL 参数是用占位符 ? 表示,并且受到位置的限制. 定位参数的问题在于, 一旦参数的顺序发生变化, 就必须改变参数绑定. 在 Spring JDBC 框架中, 绑定 ...

  7. java代码和spring框架读取xml和properties文件

    1.java文件读取properties文件 Properties props = new Properties(); try { //资源文件存放在类文件的根目录下.即是放在src下面.则不需要写路 ...

  8. 【实验二】Spring框架笔记——NamedParameterJdbcTemplate与具名参数

    在经典的 JDBC 用法中, SQL 参数是用占位符 ? 表示,并且受到位置的限制. 定位参数的问题在于, 一旦参数的顺序发生变化, 就必须改变参数绑定. 在 Spring JDBC 框架中, 绑定 ...

  9. spring框架笔记

    Spring实现依赖注入的两种方式: 1.构造方法注入 2.set方法注入,p标签注入 Spring中事务的两种实现方式: 编程式事务管理 声明式事务管理(推荐) Spring增强类型: Before ...

随机推荐

  1. SonarQube插件

    关于插件我本身使用不多,如果看不惯英文界面,那么就先装个中文插件吧. 或者上微软的官方网站进行下载 将下载的插件上传到自己的sonarqube的服务的机器上,放置插件目录下,重启sonarqube即可 ...

  2. 『无为则无心』Python函数 — 25、Python中的函数

    目录 1.函数的使用 (1)定义函数 (2)调用函数 (3)使用函数的注意事项 2.函数的参数 3.实参的类型 Python函数的说明: Python中函数的应用非常广泛,前面章节中我们已经接触过多个 ...

  3. gitlab hostname修改

    cd /var/opt/gitlab/gitlab-rails/etc vim gitlab.yml /home/git/gitlab/config/gitlab.yml production: &a ...

  4. shell运维习题训练

    注:初学shell,以下为本人自己写的答案,如果有更好的,请指教! 1. 求2个数之和: 2. 计算1-100的和 3. 将一目录下所有的文件的扩展名改为bak 4.编译并执行当前目录下的所有.c文件 ...

  5. 你会用哪些JavaScript循环遍历

    总结JavaScript中的循环遍历定义一个数组和对象 const arr = ['a', 'b', 'c', 'd', 'e', 'f']; const obj = { a: 1, b: 2, c: ...

  6. linux中如何添加用户并赋予root权限详解

    #adduser username 修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,如下所示: ## Allow root to run any commands anyw ...

  7. HAL库直流电机编码测速(L298N驱动)笔记

    主函数开始后的处理流程: 1.外设初始化:HAL_Init() 2.系统时钟配置 RCC振荡器初始化:HAL_RCC_OsConfig() RCC时钟初始化:HAL_RCC_ClockConfig() ...

  8. Shell 脚本之 MySQL 一键安装及基本配置(几分钟搞定)

    准备工作 MySQL 该版本下载地址: https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.30-linux-glibc2.12- ...

  9. java基础---设计模式(1)

    出处:https://blog.csdn.net/zhangerqing/article/details/8194653 java的设计模式分为三大类 创建型模式: 工厂方法模式.抽象工厂模式.单例模 ...

  10. 剖析:如何用 SwitchUI 5天写一个微信 —— 聊天界面篇

    前置资源 GitHub: SwiftUI-WeChatDemo 第零章:用 SwiftUI 五天组装一个微信 - wavky - 博客园 整体结构 UI 部分代码分布如上图所示,App 的主入口类为 ...