- 浏览: 5931 次
- 性别:
- 来自: 南京
-
最新评论
一 IOC概述
Ioc(控制反转:Inverse of Control)是Spring容器的内核,AOP.声明式事务等功能在此基础上开花结果。所谓控制反转,是指将对象,类的控制权反转到第三方手中,即后来提出的“依赖注入”。
1.IoC的类型
构造函数注入:通过类的构造函数,将接口实现类通过构造函数变量传入
属性注入:可以有选择的通过Setter方法完成调用类所需依赖的注入,更加灵活方便
接口注入(不常用) :将调用类所有依赖注入的方法抽取到一个接口中,调用类通过实现该接口提供相应的注入方法。
2.通过容器完成依赖关系的注入
Spring容器,它通过配置文件或注解描述类和类之间的依赖关系,自动完成类的初始化和依赖注入工作。这样就使开发者从这些底层实现类的实例化,依赖关系装配等工作中解脱出来。
二 java反射机制
1.简单实例
一般情况下,我们会使用如下的代码创建一个类的实例:
下面是通过java发射机制以一种更加通用的方式间接地操作目标类
2.类装载器ClassLoader()
类装载器就是寻找类的节码文件并构造出类在JVM内部标识对象的组件。在java中,类装载器把一个类装入JVM中,要经过以下步骤:
1.装载:查找和导入Class文件
2.链接:执行校验,准备和解析步骤,其中解析步骤是可以选择的:
a)校验:检查载入class文件数据的正确性;
b)准备:给类的静态变量分配存储空间;
c)解析:将符号引用装成直接引用
3.初始化:对类的静态变量,静态代码块执行初始化工作。
ClassLoader重要方法
3.Java反射机制
Class反射对象描述类语义结构,可以从Class对象中获取构造函数.成员变量,方法类等类元素的反射对象,并以编程的当时通过这些反射对象对目标类对象进行操作。
最主要的三个反射类:
三 资源访问利器
1.资源抽象接口
Spring设计了一个Resource接口,它为应用提供了更强的访问底层资源的能力。该接口拥有对应不同资源类型的实现类。
Resource接口的主要方法:
Resource在Spring框架中起着不可或缺的作用,Spring框架使用Resource装载各种资源,这些西苑包括配置文件资源,国际化属性文件资源等。
假设有一个文件位于Web应用的类路径下,用户可以通过以下方式对这个文件资源进行访问:
2.资源加载
为了访问不同类型的资源,必须使用相应的Resource实现类,这是比较麻烦的。Spring提供了一个强大加载资源的机制,不到那能通过“classpath:”."file:"等西苑地址前缀识别不同的资源类型,还支持Ant风格带通配符的资源地址。
Ant风格资源资质支持3种匹配符:
资源加载器
ResourceLoader接口仅有一个getResource(String location)的方法,可以根据一个资源地址加载文件资源,不过,资源地址仅支持带资源类型前缀的表达式,不支持Ant风格的资源路径表达式。ResourcePatternResolver扩展ResourceLoader接口,定义了一个新的接口方法:getResources(String locationPattern),该方法支持带资源类型前缀及Ant风格的资源路径的表达式。PathMatchingResourcePatternResolver是Spring提供了标准实现类。
由于资源路径是“classpath*:”,所以PathMatchingResourcePatternResolver将扫描所有类路径下及JAR包中对应com.bao类包下的路径,查询所有以xml为后缀的文件资源。
四 BeanFactory和ApplicationContext
Spring通过一个配置文件描述Bean及Bean之间的依赖关系,利用java语言的反射功能实例化Bean并建立Bean之间的依赖关系。
Bean工厂(com.springframework.br=eans.factory.BeanFactory)是Spring框架最核心的接口,它提供了高级IoC的配置机制。BeanFactory是管理不同类型的Java对象成为可能,应用上下文(com.springframework,context.ApplicationContext)建立在BeanFactory基础上,提供了更多面向应用的功能,它提供了国际化支持和框架事件体系,更易于创建市级应用。
对于两者的用途,可以进行简单划分:BeanFactory是Spring框架的基础设施,面向Spring本身;ApplicationContext面向使用Spring框架的开发者。
1.BeanFactory介绍
BeanFactory是一个类工厂,但和传统烦人类工厂不同,传统的类工厂仅负责构造一个或几个类的实例。而BeanFactory是类的通用工厂,它可以创建并管理各种累的对象。这些可被创建的对象本身没有什么特别之处,仅是一个POJO,Spring称这些被创建和管理的Java对象为Bean。
BeanFactory的类体系结构
Spring为BeanFactory提供了多种实现,最常用的是XMLBeanFactory。
BeanFactory接口位于类结构树的顶端,它最主要的方法就是getBean(String beanName),该方法从容器中返回特定名称的Bean,BeanFactory的功能通过其他的接口得到不断扩展
初始化BeanFactory
下面,使用Spring配置文件为Car提供配置信息,然后通过BeanFactory装载配置文件,启动Spring IoC容器。
beans.xml:
BeanFactoryTest
XmlBeanFactory通过Resource装载Spring配置信息并启动IoC容器,然后就可以通过BeanFactory#getBean(beanName)方法从IoC容器中获取Bean了。通过BeanFactory启动IoC容器时,并不会初始化配置文件中定义的Bean,初始化动作发生在第一个调用时,对于单实例(singleton)的Bean;来说,BeanFactory会缓存Bean实例,多以第二次使用getBean()获取Bean时将直接从IoC容器的缓存获取Bean实例。
2.ApplicationContext介绍
ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。
ApplicationContext类体系结构
ApplicationContext的主要实现类是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext。
ApplicationContext初始化
一个标注@Configuration注解的POJO即可提供Spring所需的Bean配置信息:
Spring为基于注解类的配置提供了专门的ApplicationContext实现类:AnnotationConfigApplicationContext。
WebApplicationContext类体系结构
ConfigurableWebApplicationContext扩展了WebApplicationContext,它允许通过配置的方式实例化WebApplicationContext,它定义了两个方法;
WebApplicationContext初始化
WebApplicationContext初始化需要ServletContext实例,也就是说它必须在拥有Web容器的前提下才能完成启动工作。在web.xml中配置自启动的Servlet或定义Web容器监听器(ServletContextListener)
Ioc(控制反转:Inverse of Control)是Spring容器的内核,AOP.声明式事务等功能在此基础上开花结果。所谓控制反转,是指将对象,类的控制权反转到第三方手中,即后来提出的“依赖注入”。
1.IoC的类型
构造函数注入:通过类的构造函数,将接口实现类通过构造函数变量传入
属性注入:可以有选择的通过Setter方法完成调用类所需依赖的注入,更加灵活方便
接口注入(不常用) :将调用类所有依赖注入的方法抽取到一个接口中,调用类通过实现该接口提供相应的注入方法。
2.通过容器完成依赖关系的注入
Spring容器,它通过配置文件或注解描述类和类之间的依赖关系,自动完成类的初始化和依赖注入工作。这样就使开发者从这些底层实现类的实例化,依赖关系装配等工作中解脱出来。
<!-- 实现类实例化--> <bean id="xxx" class="com.bao.xxx"/> <!-- 通过xxx-ref建立依赖关系 --> <bean id ="yyy" class="com.bao.yyy"p:xxx-ref="xxx"/>
二 java反射机制
1.简单实例
一般情况下,我们会使用如下的代码创建一个类的实例:
Car car = new Car(); //Car car = new Car("红旗");
下面是通过java发射机制以一种更加通用的方式间接地操作目标类
//通过类装载器获取Car类对象 ClassLoader loader = Thread.currentThread().getContextClassLoader(); Class clazz = loader.loadClass("com.baobaobao.reflect.Car"); //获取类的默认构造器对象并通过它实例化Car Constructor cons = clazz.getDeclaredConstructor(Class[]null); Car car = (Car)cons.newInstance(); //通过反射方法设置属性 Method setBrand = clazz。getMethod("setBrand",String.class) setBrand.invoke(car,"奔驰"); ......
2.类装载器ClassLoader()
类装载器就是寻找类的节码文件并构造出类在JVM内部标识对象的组件。在java中,类装载器把一个类装入JVM中,要经过以下步骤:
1.装载:查找和导入Class文件
2.链接:执行校验,准备和解析步骤,其中解析步骤是可以选择的:
a)校验:检查载入class文件数据的正确性;
b)准备:给类的静态变量分配存储空间;
c)解析:将符号引用装成直接引用
3.初始化:对类的静态变量,静态代码块执行初始化工作。
ClassLoader重要方法
- Class loadClass(String name) name参数指定类装载器需要装载类的名字,必须使用权限定类名。该方法有一个重载方法loadClass(String name ,boolean resolve),resolve 参数高数类装载器是否需要解析该类。
- Class defineClass(String name ,byte[] b,int off,int len)将类文件的字节数组装换成JVM内部的java.lang.Class对象。字节数组可以从本地文件系统,远程网络获取。name为字节数组对应的全限定类名
- Class findSystemClass(String name) 从本地文件系统载入Class文件。如果本地文件系统不存在该Class文件,将抛出ClassNotFoundExecption异常。
- Class findLoadedClass(String name) 调用该方法来查看 ClassLoader是否已装载入某个类。
- ClassLoader getParent() 获取类装载器的父装载器,除根装载器外(根装载器非java所写 c++)
3.Java反射机制
Class反射对象描述类语义结构,可以从Class对象中获取构造函数.成员变量,方法类等类元素的反射对象,并以编程的当时通过这些反射对象对目标类对象进行操作。
最主要的三个反射类:
- Constructor:类的构造函数反射类,通过Class#getconstructors()方法可以获得类的所有构造函数反射对象数组。Constructor的一个主要方法是newInstance(Object[] initargs).
- Method:类方法的反射类,通过Class#getDeclaredMethods()方法可以获取类的所有方法反射类对象数组Method[].Method最主要的方法是invoke(Object obj, Object[] args) Method还有很多用于获取类方法更多信息的方法:
- Class getRenturnType():获取方法的返回值类型;
- Class[] getParameterTypes():获取方法的入参类型数组
- Class[] getExceptionTypes():获取方法的异常类型数组
- Annotation[][] getParameterAnnotations():获取方法的注解信息
- Field:类的成员变量的反射类,通过Class#getDeclaredField(String name)则可获取某个特定名称的成员变量反射对象。
三 资源访问利器
1.资源抽象接口
Spring设计了一个Resource接口,它为应用提供了更强的访问底层资源的能力。该接口拥有对应不同资源类型的实现类。
Resource接口的主要方法:
- boolean exists():资源是否存在;
- boolean isOpen():资源是否打开;
- URL getURL() throws IOExecption:如果底层资源可以表示成URL,该方法返回对应的URL对象;
- File getFile() throws IOExecption:如果底层资源对应一个文件,该方法返回对应的FIle对象
- InputStream getInputStream() throwsIOException:返回资源对应的输入流。
Resource在Spring框架中起着不可或缺的作用,Spring框架使用Resource装载各种资源,这些西苑包括配置文件资源,国际化属性文件资源等。

假设有一个文件位于Web应用的类路径下,用户可以通过以下方式对这个文件资源进行访问:
- 通过FileSystemResource以文件系统绝对路径的方式进行访问;
- 通过ClassPathResource以类路径的方式进行访问;
- 通过ServletContextResource以相对于Web应用根目录的方式进行访问。
Resource res1 = new FIleSystemResource("D:\workspace\test\WebRoot\WEB_INF\classes\1350775993.bmp">"); Resouces res2 = new ClassPathResource("1350775993.bmp"); Resources res3 = new ServletContextResource("","WEB_INF\classes\1350775993.bmp");
2.资源加载
为了访问不同类型的资源,必须使用相应的Resource实现类,这是比较麻烦的。Spring提供了一个强大加载资源的机制,不到那能通过“classpath:”."file:"等西苑地址前缀识别不同的资源类型,还支持Ant风格带通配符的资源地址。

Ant风格资源资质支持3种匹配符:
- ?:匹配文件名中的一个字符;
- *:匹配文件中任意个字符;
- **:匹配多层路径。
资源加载器

ResourceLoader接口仅有一个getResource(String location)的方法,可以根据一个资源地址加载文件资源,不过,资源地址仅支持带资源类型前缀的表达式,不支持Ant风格的资源路径表达式。ResourcePatternResolver扩展ResourceLoader接口,定义了一个新的接口方法:getResources(String locationPattern),该方法支持带资源类型前缀及Ant风格的资源路径的表达式。PathMatchingResourcePatternResolver是Spring提供了标准实现类。
ResourcePatternResolver resolver new PathMatchingResourcePatternResolver(); Resource resources[] = resolver.getResources("classpath*:com/bao/**/*.xml");
由于资源路径是“classpath*:”,所以PathMatchingResourcePatternResolver将扫描所有类路径下及JAR包中对应com.bao类包下的路径,查询所有以xml为后缀的文件资源。
四 BeanFactory和ApplicationContext
Spring通过一个配置文件描述Bean及Bean之间的依赖关系,利用java语言的反射功能实例化Bean并建立Bean之间的依赖关系。
Bean工厂(com.springframework.br=eans.factory.BeanFactory)是Spring框架最核心的接口,它提供了高级IoC的配置机制。BeanFactory是管理不同类型的Java对象成为可能,应用上下文(com.springframework,context.ApplicationContext)建立在BeanFactory基础上,提供了更多面向应用的功能,它提供了国际化支持和框架事件体系,更易于创建市级应用。
对于两者的用途,可以进行简单划分:BeanFactory是Spring框架的基础设施,面向Spring本身;ApplicationContext面向使用Spring框架的开发者。
1.BeanFactory介绍
BeanFactory是一个类工厂,但和传统烦人类工厂不同,传统的类工厂仅负责构造一个或几个类的实例。而BeanFactory是类的通用工厂,它可以创建并管理各种累的对象。这些可被创建的对象本身没有什么特别之处,仅是一个POJO,Spring称这些被创建和管理的Java对象为Bean。
BeanFactory的类体系结构
Spring为BeanFactory提供了多种实现,最常用的是XMLBeanFactory。

BeanFactory接口位于类结构树的顶端,它最主要的方法就是getBean(String beanName),该方法从容器中返回特定名称的Bean,BeanFactory的功能通过其他的接口得到不断扩展
- ListableBeanFactory:该接口定义了访问容器中Bean基本信息的若干方法,如查看Bean的个数,获取某一类型Bean的配置名等
- HierarchicalBeanFactory:父子级联IoC容器的接口,子容器可以通过接口方法访问父容器;
- ConfigurableBeanFactory:是一个重要的接口,增强了IoC容器的可定制性,它定义了设置类装载器,属性编辑器,容器初始化后置处理等方法;
- AutowireCapableBeanFactory:定义了一个将容器中的Bean按某种规则(如按名字匹配。类型匹配等)进行自动装配的方法;
- SingletonBeanRegistry:定义了允许在运行期间向容器注册单实例Bean的方法;
- BeanDefinitionRegistry:Spring配置文件中每一个<bean>节点元素在Spring容器里都通过一个BeanDefinition对象表示,它描述了Bean的配置信息。而BeanDefinitionResgistry接口提供了向容器手工注册BeanDefinition对象的方法。
初始化BeanFactory
下面,使用Spring配置文件为Car提供配置信息,然后通过BeanFactory装载配置文件,启动Spring IoC容器。
beans.xml:
<bean id="car1" class="com.baobaobao.Car" p:brand="奔驰" p:color="black" p:maxSpeed="200"/>
BeanFactoryTest
//通过XmlBeanFactory实现类启动SpringIoC容器 ResourcePatternReslver resolver = new PathMatchingResourcePatternResolver(); Resource res =resolver.getResource("classpath:com/baobaobao/beanfactory/beans.xml"); BeanFactory bf = new XmlBeanFactory(res); Car car = bf.getBean("car",Car.class);
XmlBeanFactory通过Resource装载Spring配置信息并启动IoC容器,然后就可以通过BeanFactory#getBean(beanName)方法从IoC容器中获取Bean了。通过BeanFactory启动IoC容器时,并不会初始化配置文件中定义的Bean,初始化动作发生在第一个调用时,对于单实例(singleton)的Bean;来说,BeanFactory会缓存Bean实例,多以第二次使用getBean()获取Bean时将直接从IoC容器的缓存获取Bean实例。
2.ApplicationContext介绍
ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。
ApplicationContext类体系结构
ApplicationContext的主要实现类是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext。

ApplicationContext初始化
//等同于classpath:com/baobaobao/context/beans.xml ApplicationContext ctx = new ClassPathXmlApplicationContext("com/baobaobao/context/beans.xml"); //ApplicationContext ctx = new FileSystemXmlApplicationContext("com/baobaobao/context/beans.xml");等同于file:com/baobaobao/context/beans.xml
一个标注@Configuration注解的POJO即可提供Spring所需的Bean配置信息:
//表示是一个配置信息提供类 @Configuration public class Beans{ //定于一个Bean @Bean(name="car") public Car buildCar(){ Car car=new Car(); car.set... ... } }
Spring为基于注解类的配置提供了专门的ApplicationContext实现类:AnnotationConfigApplicationContext。
ApplicationContext ctx = new AnnotationConfigApplicationContext(Beans.class); Car car=ctx.getBean("car".Car.class);
WebApplicationContext类体系结构

ConfigurableWebApplicationContext扩展了WebApplicationContext,它允许通过配置的方式实例化WebApplicationContext,它定义了两个方法;
- setServletContext(ServletContext servletContext):为Spring设置Web应用上下文
- setConfigLocations(String[] configLocations):设置Spring配置文件地址。
WebApplicationContext初始化
WebApplicationContext初始化需要ServletContext实例,也就是说它必须在拥有Web容器的前提下才能完成启动工作。在web.xml中配置自启动的Servlet或定义Web容器监听器(ServletContextListener)
<!-- 从类路径下加载Spring配置文件,classpath关键字特定类路径下加载 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- 负责启动Spring容器的监听器,它将引用context-param处的上下文参数获得Spring配置文件地址 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
发表评论
-
Spring学习(四)---Spring Aop基础
2016-05-21 22:50 809一 Aop概述 AOP(面向切 ... -
Spring学习(三)---Spring容器的高级主题
2016-05-19 23:51 1827一 Spring容器技术内幕 1 内部工作机制 对于这 ... -
Spring学习(二)---在IoC容器中装配Bean(2)
2016-05-18 22:56 728##四 注入参数详解 ###1.字面值 XML中共有5个特 ... -
Spring学习(二)---在IoC容器中装配Bean
2016-05-17 23:42 563一 Spring配置概述 1.Spring容器高层视图 要 ... -
Spring学习(一)---IoC介绍(2)
2016-05-16 23:06 425五 Bean的生命周期 在S ...
相关推荐
这个jar文件"Spring-ioc-jar"包含了实现Spring IOC功能所需的关键类和接口,是学习和使用Spring IOC技术的基础。 Spring框架的IOC容器是其核心组件,主要由`ApplicationContext`和`BeanFactory`两个接口代表。`...
《Spring框架深度解析》 Spring Framework,作为Java开发领域中的基石,是企业级应用开发的首选框架。...这不仅对于Java开发者,对于所有希望深入学习软件设计和架构的人来说,都是一份宝贵的资料。
在Java Spring框架中,Spring IoC(Inversion of Control,控制反转)是核心特性之一,它使得应用程序的组件之间的依赖关系不再由代码直接管理,而是交由Spring IoC容器负责。这种设计模式降低了代码间的耦合,提高...
开发者可以通过阅读这些文档快速上手,并深入学习Spring的高级特性,如依赖注入、AOP(面向切面编程)、数据访问、Web应用、测试等。 2. **libs文件夹**: 这个文件夹包含了Spring框架所需的jar包,这些jar包涵盖...
Spring框架是Java开发中的一个核心组件,它提供了许多功能,其中最重要的一项就是Inversion of Control(IoC),也称为Dependency Injection(DI)。IoC容器是Spring的核心,它负责管理对象的生命周期和对象间的依赖...
虽然随着版本的更新,Spring框架的功能和架构有了很大的发展,但1.0版本的基本理念和设计模式至今仍然具有重要的学习价值。 通过深入研究这个压缩包,开发者不仅可以了解Spring Framework的基础原理,还可以对比...
这些文档包括用户指南、参考手册、API文档以及开发者指南,是学习和使用Spring框架的重要参考资料。开发者可以通过阅读这些文档深入理解Spring框架的工作原理,以及如何有效地使用其各种特性。 **spring-5.3.1-...
Spring Framework 是一个开源的应用程序框架,它主要针对Java平台,为构建企业级应用提供了全面的解决方案。5.3.7.RELEASE是Spring Framework的一个稳定版本,包含了一系列的增强功能和性能优化。本压缩包“spring-...
Spring Tool Suite(STS)将Eclipse的强大学习曲线和强大的开发工具与Spring的开发工具集结合在一起,提供了一流的Spring支持,包括智能代码补全、配置向导、项目模板、Spring Boot启动器、Spring Roo支持等。...
- **src**:源代码,对于学习和理解Spring的内部工作原理非常有用。 - **docs**:文档,包括API参考、用户指南和开发者指南,帮助开发者更好地使用Spring框架。 - **dist**:预编译的库文件,如jar包,可以被引入到...
例如,关于IoC(Inversion of Control,控制反转)的实现,Spring使用了XML配置或注解来定义bean的依赖关系,通过反射机制动态加载和管理bean。另外,AOP模块实现了切面编程,允许我们定义横切关注点,如日志、事务...
这些文档涵盖了从基本概念到高级特性的所有内容,是学习和使用Spring不可或缺的资源。 “spring-5.3.2-schema.zip”文件则包含了Spring配置文件的XML Schema定义,这些定义帮助开发者更好地理解和编写符合规范的...
spring-ioc学习 新手可以下过来学习下, spring-ioc简介
它提供了一种将Spring容器与OSGi服务层集成的方法,使得开发者可以使用Spring的IoC(控制反转)和AOP(面向切面编程)特性来管理OSGi服务。 3. **1.2.0-rc1版本** "spring-osgi-1.2.0-rc1"是Spring OSGi的一个早期...
在本例中,可能有一个名为`spring-ioc-anno`的包,其中包含着使用注解配置的Spring bean。 为了启动Spring容器并运行应用程序,我们可以创建一个主类,使用`ApplicationContext`来加载配置并获取bean。例如: ```...
其中,用户指南介绍了如何开始使用Spring,包括安装、配置和基本用法;参考手册则深入到各个模块的细节,提供了详细的API解释和示例代码;API文档则是开发者查阅具体类和接口的工具。 四、应用实践 在实际项目中,...
2. **Spring-5.2.15.RELEASE-dist.zip**:这个文件很可能是Spring框架的核心库,包括了Spring的核心模块,如IoC(Inversion of Control)容器、AOP(Aspect-Oriented Programming)支持、数据访问/集成层、Web层等。...
Spring的IoC(Inversion of Control)容器和AOP(Aspect-Oriented Programming)支持在5.3.2中得到加强,包括对Java配置的优化,以及对注解的更精细控制。此外,还增强了Bean生命周期管理,如条件化 Bean 的创建和...
标题中的"spring-01-ioc1.rar"表明这是一个关于Spring框架中控制反转(Inversion of Control,简称IoC)的初级教程资源。Spring是Java领域广泛应用的一个轻量级开源框架,它的核心特性就是IoC,它使得应用程序的组件...
Spring框架是Java开发中不可或缺的一部分,它以其强大的依赖注入(IOC)和面向切面编程(AOP)功能闻名。在"spring-framework-5.2.0.RELEASE-master.zip"这个压缩包中,我们可以深入理解Spring的核心机制,通过源码...