Java 横向技术 Spring框架【笔记】
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框架【笔记】的更多相关文章
- Java横向技术 网络【笔记】
Java横向技术 网络[笔记] 计算机网络 服务器返回给客户端 http 响应包的状态码有哪几大类?302.304 分别是什么意思? 状态码分为五大类: (1)信息性状态码(Informatio ...
- Java EE数据持久化框架笔记 • 【目录】
章节 内容 实践练习 Java EE数据持久化框架作业目录(作业笔记) 第1章 Java EE数据持久化框架笔记 • [第1章 MyBatis入门] 第2章 Java EE数据持久化框架笔记 • [第 ...
- 【Java】关于Spring框架的总结 (三)
前文对 Spring IoC 和 Spring AOP 的实现方法进行了整合.如果有不明白的或有质疑的地方可以评论出来,一起探讨问题,帮助别人也是帮助自己!本文探讨的中心主要放在 Spring 的注解 ...
- 【Java】关于Spring框架的总结 (一)
本文总结一些关于Spring框架的理解,注意点及基础操作.如果有不对的地方,欢迎批评和建议.大家一起努力吧! Spring 框架简介 Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创 ...
- Java面试04|Spring框架
1.动态代理的几种方式 Java主要有两种代理,JDK和Cglib动态代理.先看JDK代理实例如下: JDK创建代理有一个限制,即它只能为接口创建代理实例.举个例子如下: public interfa ...
- (转) Spring框架笔记(二十五)——NamedParameterJdbcTemplate与具名参数(转)
在经典的 JDBC 用法中, SQL 参数是用占位符 ? 表示,并且受到位置的限制. 定位参数的问题在于, 一旦参数的顺序发生变化, 就必须改变参数绑定. 在 Spring JDBC 框架中, 绑定 ...
- java代码和spring框架读取xml和properties文件
1.java文件读取properties文件 Properties props = new Properties(); try { //资源文件存放在类文件的根目录下.即是放在src下面.则不需要写路 ...
- 【实验二】Spring框架笔记——NamedParameterJdbcTemplate与具名参数
在经典的 JDBC 用法中, SQL 参数是用占位符 ? 表示,并且受到位置的限制. 定位参数的问题在于, 一旦参数的顺序发生变化, 就必须改变参数绑定. 在 Spring JDBC 框架中, 绑定 ...
- spring框架笔记
Spring实现依赖注入的两种方式: 1.构造方法注入 2.set方法注入,p标签注入 Spring中事务的两种实现方式: 编程式事务管理 声明式事务管理(推荐) Spring增强类型: Before ...
随机推荐
- 箭头函数中this指向问题
// 问题:箭头函数中的this是如何查找的? // 答案:向外层作用域中,一层层查找this,直到有this的定义
- buu 红帽杯easyre
一.拖入ida静态分析 找到关键函数,然后 这步是可以得出前4个字符是flag,不知道为啥我这边的v15的内存地址为空,不然可以异或解出来的,ida日常抽风... 十次的base64加密,我用在线平台 ...
- linux中如何添加用户并赋予root权限详解
#adduser username 修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,如下所示: ## Allow root to run any commands anyw ...
- ARTS第九周
1.Algorithm:每周至少做一个 leetcode 的算法题2.Review:阅读并点评至少一篇英文技术文章3.Tip:学习至少一个技术技巧4.Share:分享一篇有观点和思考的技术文章 以下是 ...
- 关于hive的基础
Hive基础 1.引入原因 对存在HDFS上的文件或HBase中的表进行查询时,是要手工写一堆MapReduce代码 对于统计任务,只能由懂MapReduce的程序员才能搞定 事实上,许多底层细节实际 ...
- C语言:特殊点
编译器给变量分配内存在函数外部定义的变量叫做全局变量(Global Variable),在函数内部定义的变量叫做局部变量(Local Variable)一个变量,即使不给它赋值,它也会有一个默认的值, ...
- Jmeter之事务控制器
性能测试的结果统计时我们一定会关注TPS,TPS代表的是每秒事务数,每个事务对应的是我们的请求.虽然JMeter能够帮我们把每个请求统计成一个事务,但有时候我们希望把多个操作统计成一个事务,JMete ...
- Vue.js源码解析-Vue初始化流程之动态创建DOM
目录 前言 一._update 如何判断是初始化还是更新操作? 二.patch 2.1 patch 定义 2.2 初始化的 patch 三.createElm 动态创建DOM 3.1 创建组件节点 3 ...
- Day11继承、封装、多态-面向对象编程(2)
封装 我们设计程序要追求 高内聚,低耦合 . 高内聚:类的内部数据操作细节自己完成,不允许外部干涉 低耦合:仅暴露少量方法给外部使用 封装(数据的隐藏) 通常,应禁止直接访问一个对象中数据的实际表示, ...
- MapReduce学习总结之java版wordcount实现
一.代码实现: package rdb.com.hadoop01.mapreduce; import java.io.IOException; import org.apache.hadoop.con ...