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和其他的应用服务器上的用户