首先介绍下spring的核心模块:
如图:
Spring IOC
IOC (Inversion of Control,控制反转) 是spring的核心,所谓IOC,就是spring来负责控制对象的生命周期和对象间的关系。
传统开发模式:对象之间相互依赖
IOC开发模式: IOC容器安排对象之间的依赖
IOC理论背景:
对于这种耦合关系,如果其中一个齿轮出类问题,机器就不能正常运转。因此,需要降低对象之间的耦合度。
IOC的处理模式简单来说就是把复杂的系统分解成相互独立的对象。借助第三方实现对象的解耦。
把中间的部分拿掉,就是最理想的系统:
这样,在实现A的时候,就无须再考虑BCD了
IOC的另外的名字是依赖注入(DI, Dependency Injection):就是由IOC容器运行期间,动态的将某种依赖关系注入到对象之中,所以,依赖注入和控制反转时从不同角度的描述同一件事情,就是指引入IOC容器,利用依赖关系注入方式,实现对象之间的解耦。
IOC通俗理解:
IOC : 创建对象实例的控制权从代码控制剥离到IOC容器控制,就是在xml文件中控制,侧重于原理。
DI:创建对象实例时,为这个对象注入属性值或其他对象实例,侧重于实现。
Spring AOP
AOP专门用于处理系统中分布于各个模块中的交叉关注点的问题,在JavaEE应用中,通常通过AOP来处理一些具有横切性质的系统级服务,如:事务管理,安全检查,缓存,对象池管理等。
如图:
如果需要修改深色部分的代码,需要修改三个地方。
这里,只需要修改深色部分就可以了
AOP代理其实是由AOP框架动态生辰的一个对象,该对象可以作为目标对象使用,AOP代理包含的方法与目标对象的方法如图:
在AOP中,需要程序员参与的主要有三个部分:
定义普通业务组件,
定义切入点,一个切入点可能横切多个业务组件
定义增强处理
代理对象的方法=增强处理+被代理对象的方法;
AOP的通俗理解:
一个组件A,不关心其他常用的服务组件B,但是这个组件A使用组件B的时候,不是组件A自身区调用,而是通过配置等其他方式,比如Spring中可以通过xml配置文件,这样就使得A压根不需要知道B组建是怎么样的,是否存在,A只关心自己的业务逻辑,具体A使用B的时候,配置文件去做,与具体的A组件无关。
2 .spring 的框架开发包:(需要引入到jar文件中的包)
2.1 核心开发包
spring Core: 包含spring框架的核心工具类,spring的其他组件都需要使用这个包。
spring Beans: 所有应用都要用到,包含访问配置文件, 创建和管理bean,进行控制反转和依赖注入相关的操作。
spring AOP: 使用spring 的AOP需要的文件,申明性的事务管理,日志系统的引入等
spring Context:为spring核心提供大量扩展,它是访问定义和配置的任何对象的媒介。ApplicationContext 接口是上下文模块的重点。
2.2 业务组件包, 提供各种企业级的服务:
spring Aspects: 模块提供了与 AspectJ 的集成,这是一个功能强大且成熟的面向切面编程(AOP)框架。
spring Context Support : 这个开发包包含了支持缓存catch、JCA、JMX、邮件服务、任务计划等方面的这些所有类。
spring Expression :是Spring表达式语言。spring3.0创建了一种新的方式用于配置对象的注入,他便是SPEL即Spring Expression Language。有别于传统的Spring静态配置,他支持在运行时操作和查询对象,其语法类似统一的EL语言。
spring Framework Bom: 在使用Maven时 确保所有的Spring模块都使用统一的版本。
spring Instrument: 提供spring3.0对服务器的代理接口
spring Instrument Tomcat: 提供spring 3.0对Tomcat连接池的集成。
spring JDBC: 包含了Spring对JDBC数据访问时进行封装的所有类。Spring提供了两种使用Spring JDBC API的最佳实践:1.以JDBC Template为核心的基于Template JDBC的使用方式。2.是在JDBC Template的基础之上构建的基于操作对象的JDBC 的使用方式。
spring JMS: 提供了对Spring JMS1.0和JMS1.1的支持类。Spring 的JMS抽象框架简化了JMS API的使用并与JMS的提供者平滑的继承。org.springframework.jms.core包提供了在Spring当中使用JMS的核心功能,他的模版类处理资源的创建和释放,简化了JMS的使用。
spring orm : Spring对DAO特性进行了扩展,使其支持iBATIS 、JDO、OJB、TopLink,因为Hibernate已经独立成包了,所以不包含在这个包中了。 在使用这个包时必须同时包含sprin-dao.jar
spring oxm: Spring对Object XML的映射支持,可以让JAVA与XML之间来回切换。这是Spring3.0的一个新特性。OXM既是OXMapper,OX映射器这个概念并不新鲜,O代表Object ,X代表XML。他的目的是在JAVA和XML文档之间来回转换。
spring struts: 提供了对struts框架的支持。
spring test: 提供对junit等的检测封装。
spring tx :Spring transection,他为JDBC、Hibernate、JDO、JPA等提供了一致的声明式的编程式事物管理。
spring web: 包含web应用研发时用到Spring框架时所需要的的核心类。
spring webmvc: 包含了spring mvc框架相关的所有类,如果应用使用了独立的spring mvc框架,则无需使用这个jar包
spring webmvc portlet: 提供了对Spring MVC的增强,支持了portlet标准。Spring不仅支持传统的web开发,也支持JSR-168 portlet的开发。PortletMVC框架尽可能多的采用WEB MVC的框架,使相同的底层表现层抽象和整合技术。
如何选择使用这些包呢:
如果构建web应用并将全程使用spring,就使用全部的开发包文件,如果仅用到简单的ioc容器,只要spring-core和spring-beans两个jar包。
3 Spring IOC 的理解
3.1 IOC概述:
IOC是spring容器的内核,AOP,声明事务等功能都依赖于此功能,它涉及代码解耦,设计模式,代码优化等问题的考量:
DI概念的引入: 让调用类对某一接口实现类的依赖关系由第三方引入, 以移除调用类对某一接口实现类的依赖。
3.2.IOC 的注入类型 :
- 构造函数注入:通过调用类的构造函数,将接口实现类通过构造函数变量转入。
- 属性注入:通过setter方法完成调用类所需依赖的注入,更加灵活方便
- 接口注入:将调用类所有依赖注入的方法抽象到一个接口中,调用类通过实现该接口提供相应的注入方法。
在理解spring ioc之前,关注下java的反射机制
4. Java反射机制
Java语言允许通过程序化的方式间接对Class的对象实力操作,Class文件由类转载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息,如构造函数,属性和方法。
ClassLoader : 类装载器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件,主要工作由ClassLoader及其子类负责,ClassLoader是一个重要的java运行时系统组件,他负责在运行时查找和装入Class字节码文件。
工作机制:
- 装载: 查找和导入Class类文件
- 链接:执行校验,准备和解析步骤
- 初始化:对类的静态变量,静态代码块执行初始化工作
类装载器的重要方法:java.lang
- Class loadClass(String name) ; //name全限定类名
- Class defineClass(String name, byte[]b, int off, int len); // 将类文件的字节数组转换为java.lang.class对象;
- Class findSystemClass(String name); //从本地文件系统载入class文件
- Class findLoadedClass(String name); //查看classLoader是否装载到某个类中
- ClassLoader getParent();//获得类装载器的父装载器
Class反射对象描述类语义结构,可以从Class对象中获取构造函数,成员变量,方法等类元素反射对象,并以编程的方式通过这些反射对象对目变革对象进行操作。这些反射对象类在java.reflect包中定义,主要的三个反射类有:
- Constructor. 类的构造函数反射类
- Method :获取类方法
- Field :类的成员变量反射类
Java反射机制与ioc的关系:
在spring中,通过IOC可以将实现类,参数信息等配置在其对应的配置文件中,当需要更改实现类或参数信息时,只需要需改配置文件即可,还可以对某对象所需要的其他对象进行注入,这种注入都是在配置文件中做的。
spring的ioc的实现原理就是利用java的反射机制,spring的工厂类完成配置文件的读取,利用反射机制注入对象等工作,可以通过bean的名称获取对应的对象。
5 Spring资源访问工具类
JDK提供的访问资源的类不能很好的满足各种底层资源的访问需求,因此,Spring提供了一个Resource接口:
如要方法:
- boolean exists(); //判断资源是否存在
- boolean isOpen(); //资源是否打开;
- URL getURL(); //如果底层资源对应一个URL,返回对应的URL对象
- File getFile(); //如果底层资源对应一个文件,返回对应file文件
- InputStream getInputStream(); //返回对应输入流
具体实现类:
- ByteArrayResource: 二进制数组表示的资源
- ClassPathResource; 类路径下的资源
- FileSystemResource; 文件系统资源
- InputStreamResource:
- ServletContextResource: 为访问web容器中上下文的资源设计,支持流,URL方式的访问
- UrlResource: 可以访问任何通过URL表示的资源
Spring提供类加载资源的机制,自动识别不同资源类型
资源类型地址前缀:
- classpath classpath:com/xx/bian.xml 从类路径加载
- File file:/com/xx/bean.xml 主要使用url,从文件系统路径中装载资源
- http:
- ftp
- 无前缀
Spring定义了一套资源加载的接口,并提供类实现类:
ResourceLoader: : getResource(String location):Resource:
- Resource :getFile() File .........
6. BeanFactory和ApplicationContext
BeanFactory是Spring框架最核心的接口,它提供类高级IOC配置机制 ==IOC容器
ApplicationContext建立在BeanFactory基础之上,提供类更多面向应用的功能。== 应用上下文
BeanFactory是一个类工厂,可以创建和管理各种类对象,Spring称这些创建和管理的java对象为bean。
类体系结构:
- XmlBeanFactory:
- ListableBeanFactory:
- HierarhicalBeanFactory : 父子级联IOC容器的接口
- ConfigurableBeanFactory
- ...........
初始化顺序:
- 创建配置文件
- 装载配置文件
- 启动Ioc容器
- 获取Bean实例
ApplicationContext由BeanFactory派生而来。提供了更多面向实际应用的功能。在BeanFactory中,很多功能需要以编程的方式实现,而在ApplicationContext中通过配置的方式实现
ApplicationContext的实现类:
- ClassPathApplicationContext :类路径加载配置文件
- FileSystemApplicationContext
- ConfigureableApplicationContext:
扩展接口:
- ApplicationEventPublisher:
- MessageSource
- ........
学习spring随手记录的一些东西,具体参考:www.jikexueyuan.com