文档章节

Spring学习(一)---IoC介绍

l
 lloouuhh56
发布于 2016/05/16 07:09
字数 2938
阅读 30
收藏 0
点赞 2
评论 0

一 IOC概述 
Ioc(控制反转:Inverse of Control)是Spring容器的内核,AOP.声明式事务等功能在此基础上开花结果。所谓控制反转,是指将对象,类的控制权反转到第三方手中,即后来提出的“依赖注入”。 
1.IoC的类型 
构造函数注入:通过类的构造函数,将接口实现类通过构造函数变量传入 
性注入:可以有选择的通过Setter方法完成调用类所需依赖的注入,更加灵活方便 
接口注入(不常用) :将调用类所有依赖注入的方法抽取到一个接口中,调用类通过实现该接口提供相应的注入方法。 
2.通过容器完成依赖关系的注入 
Spring容器,它通过配置文件或注解描述类和类之间的依赖关系,自动完成类的初始化和依赖注入工作。这样就使开发者从这些底层实现类的实例化,依赖关系装配等工作中解脱出来。 

Java代码 下载 

  1. <!-- 实现类实例化-->  
  2. <bean id="xxx" class="com.bao.xxx"/>  
  3. <!-- 通过xxx-ref建立依赖关系 -->  
  4. <bean id ="yyy" class="com.bao.yyy"p:xxx-ref="xxx"/>  


二 java反射机制 
1.简单实例 
  一般情况下,我们会使用如下的代码创建一个类的实例: 

Java代码下载  

  1. Car car = new Car();  
  2. /Car car = new Car("红旗");  


下面是通过java发射机制以一种更加通用的方式间接地操作目标类 

Java代码下载  

  1. //通过类装载器获取Car类对象  
  2. ClassLoader loader = Thread.currentThread().getContextClassLoader();  
  3. Class clazz = loader.loadClass("com.baobaobao.reflect.Car");  
  4.   
  5. //获取类的默认构造器对象并通过它实例化Car  
  6. Constructor cons = clazz.getDeclaredConstructor(Class[]null);  
  7. Car car = (Car)cons.newInstance();  
  8.   
  9. //通过反射方法设置属性  
  10. Method setBrand = clazz。getMethod("setBrand",String.class)  
  11. setBrand.invoke(car,"奔驰");  
  12. ......  



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应用根目录的方式进行访问。

 

Java代码 

  1. Resource res1 = new FIleSystemResource("D:\workspace\test\WebRoot\WEB_INF\classes\1350775993.bmp">");  
  2.   
  3. Resouces res2 = new ClassPathResource("1350775993.bmp");  
  4.   
  5. 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提供了标准实现类。 

Java代码 

  1. ResourcePatternResolver resolver new PathMatchingResourcePatternResolver();  
  2. 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: 

Java代码 

  1. <bean id="car1" class="com.baobaobao.Car"  
  2.   p:brand="奔驰" p:color="black" p:maxSpeed="200"/>  



BeanFactoryTest 

Java代码 

  1. //通过XmlBeanFactory实现类启动SpringIoC容器  
  2. ResourcePatternReslver resolver = new PathMatchingResourcePatternResolver();  
  3. Resource res =resolver.getResource("classpath:com/baobaobao/beanfactory/beans.xml");  
  4. BeanFactory bf = new XmlBeanFactory(res);  
  5. 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初始化 

Java代码 

  1. //等同于classpath:com/baobaobao/context/beans.xml  
  2. ApplicationContext ctx = new ClassPathXmlApplicationContext("com/baobaobao/context/beans.xml");  
  3.   
  4. //ApplicationContext ctx = new FileSystemXmlApplicationContext("com/baobaobao/context/beans.xml");等同于file:com/baobaobao/context/beans.xml  


一个标注@Configuration注解的POJO即可提供Spring所需的Bean配置信息: 

Java代码 

  1. //表示是一个配置信息提供类  
  2. @Configuration  
  3. public class Beans{  
  4.   //定于一个Bean  
  5.   @Bean (name="car")  
  6.   public Car buildCar(){  
  7.     Car car=new Car();  
  8.     car.set...  
  9.     ...  
  10.   }  
  11. }  


  Spring为基于注解类的配置提供了专门的ApplicationContext实现类:AnnotationConfigApplicationContext。 

Java代码 

  1. ApplicationContext ctx = new AnnotationConfigApplicationContext(Beans.class);  
  2. 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) 

Java代码 

  1. <!-- 从类路径下加载Spring配置文件,classpath关键字特定类路径下加载 -->  
  2.     <context-param>  
  3.         <param-name>contextConfigLocation</param-name>  
  4.         <param-value>classpath:applicationContext.xml</param-value>  
  5.     </context-param>  
  6.     <!-- 负责启动Spring容器的监听器,它将引用context-param处的上下文参数获得Spring配置文件地址 -->  
  7.     <listener>  
  8.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  9.     </listener>  

© 著作权归作者所有

共有 人打赏支持
l
粉丝 0
博文 3
码字总数 5525
作品 0
杭州
国内一线架构师提供的Spring Boot学习路线

Spring Boot 学习路线,本文计划根据作者多年经验,来分析和制定一个学习使用 Spring Boot技术的步骤路线图。 一、准备工作 俗话说:“工欲善其事必先利其器”。特别是软件开发,这样一个重视...

java高级架构牛人
06/26
0
0
Spring实战 (一) 一切从Bean开始

Spring可以做很多事情,但是归根究底.Spring的核心仅仅是依赖注入(DI)/控制反转(IoC)和面向切面编程(AOP)而已.Spring的一切都是基于这2点 Spring的一切都是从Bean开始的.什么是Bean?凡是被Spr...

kenshiro
2013/09/05
0
0
Spring IOC 容器源码分析系列文章导读

1. 简介 Spring 是一个轻量级的企业级应用开发框架,于 2004 年由 Rod Johnson 发布了 1.0 版本。经过十几年的迭代,现在的 Spring 框架已经非常成熟了。Spring 包含了众多模块,包括但不限于...

coolblog
05/30
0
0
spring学习3-Ioc和DI的简单介绍

控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转还有一个名字叫做依赖注入(Depende...

大嘴吃鸡腿
2014/03/16
0
0
向Spring大佬低头——大量源码流出解析

用Spring框架做了几年的开发,只停留在会用的阶段上,然而Spring的设计思想和原理确实一个巨大的宝库。大部分人仅仅知道怎么去配,或着加上什么属性就能达到什么效果,这些东西都可以通过查文...

Java团长17
07/11
0
0
【转载】轻松学习Spring: IoC容器和Dependency Injection模式

最近公司需要,项目中要用到Spring和Ibatis。趁着过年好好学习学习。Ibatis就如同Hibernate一样的持久层技术,学习起来难度不大,但Spring可不一样,揣着Ioc,DJ和AOP,四处走红。学起来可不...

Start-up
2012/05/17
0
0
1000行代码读懂Spring(一)- 实现一个基本的IoC容器

引言 最近在读Spring源码,但是Spring代码层次嵌套太多,读起来有很大跳跃性,我有个朋友甚至开玩笑说,读Spring得拿纸笔,把方法和层次都写下来。 其实Spring我已经接触很久了,记得大学有个...

黄亿华
2014/01/13
0
37
轻松学习Spring IoC容器和Dependency Injection模式(转)

转载:Bromon的blog 下面就是引用他说的话: IoC与DI   首先想说说IoC(Inversion of Control,控制倒转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责...

zgyin688
2012/10/09
0
0
SpringBoot的幕后推手...

一、背景   这两年随着微服务的盛行,SpringBoot框架水到渠成的得到了高曝光,作为程序猿的我们,现在要是不知道一点SpringBoot相关的东西,貌似出去找工作都会被深深地鄙视,不过在我们开...

Java工程师-Distance
06/01
0
0
spring ioc 和 aop-----一些小结

话说,学习spring也快大半年了,写业务层代码也写了半年之久了,对于spring中的一些核心技术现在还是似懂非懂的,很是纠结啊。。。 最近一直看别人写的对于这一块的理解,于是乎,我有点懂了...

bosscheng
2013/05/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Tomcat中JAVA JVM内存溢出及合理配置

一、Java JVM内存介绍 JVM管理两种类型的内存,堆和非堆。按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创...

學無止境
4分钟前
0
0
centOS7.4+nginx 1.12.2负载均衡

centOS7.4+nginx 1.12.2负载均衡 2018年04月10日 09:24:51 阅读数:58 1:参数信息 三台 centOS7.4 A,B,C A作为主服务器,B C作为分流的服务器 都搭建 nginx 1.12.2 一:安装 nginx 1:下载...

linjin200
10分钟前
0
0
分布式之抉择分布式锁

前言: 目前网上大部分的基于zookpeer,和redis的分布式锁的文章都不够全面。要么就是特意避开集群的情况,要么就是考虑不全,读者看着还是一脸迷茫。坦白说,这种老题材,很难写出新创意,博...

Java大蜗牛
15分钟前
0
0
rm: cannot remove `xxx’: Operation not permitted

rm: cannot remove `xxx': Operation not permitted可以先用lsattr xxx查看文件的隐藏属性。如果看到-----a-------的情况,可以用chattr -a xxx去除a属性,然后再进行删除就可以了....

殘留回憶
15分钟前
0
0
oracle 如何查看当前用户的表空间名称

如何查询当前用户的表空间名称?因为oracle建立索引,需要知道当前用户的表空间,查找了一下资料 --查询语法-- select default_tablespace from dba_users where username='登录用户' 如,...

youfen
19分钟前
0
0
MicroPython-TPYBoard开发板DIY小型家庭气象站

对于喜欢登山的人来说,都会非常关心自己所处的高度跟温度,海拔高度的测量方法,海拔测量一般常用的有两种方式,一是通过GPS全球定位系统,二是通过测出大气压,根据气压值算出海拔高度。 ...

bodasisiter
19分钟前
0
0
抓取沪A股票资金流向数据

library(rvest)mydata<-list()day1<-Sys.Date()day2<-Sys.Date()-7stock<-c("600695","600734","603693","601990","603650","603045","603895","600735","601999","603970","600619"......

cuyi
20分钟前
0
0
Java中mqtt消息队列发送和订阅消息

1.首先本地建立mqtt协议的服务器 2.直接上代码 package io.powerx.test;import java.util.Date;import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;import org.eclipse.p......

江湖鱼大虾
21分钟前
0
0
数据结构-树的学习

1. 相关连接 维基-二叉搜索树 维基-红黑树 思否-红黑树

liuyan_lc
23分钟前
0
0
Dubbo 源码解读——自定义 Classloader 之 ExtensionLoader

众所周知,Dubbo 是阿里巴巴公司自主研发开源的一个高性能的服务框架(现已捐献给 Apache 基金会组织),应用之间可以通过 RPC 的方式来互相调用并返回结果。主要基于 Java 语言开发,它提供...

Ryan-瑞恩
32分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部