Spring-IOC容器的概述-keke老师

来源:互联网 发布:淘宝订单评价过期 编辑:程序博客网 时间:2024/04/23 17:47
Java
1:IOC的概述
IOC(控制反转 Inversion of Control),是Spring容器的内核,Aop,事务申明等功能都是在ioc基础之上开花结果。主要解决的问题,代码解耦,设计模式,代码重构和优化等。


案例如下:在项目的src目录下新建一个bean.xml如下:
 1<?xml version="1.0" encoding="UTF-8"?>2<beans xmlns="http://www.springframework.org/schema/beans"3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context"5 xmlns:p="http://www.springframework.org/schema/p"6 xsi:schemaLocation="http://www.springframework.org/schema/beans   7  http://www.springframework.org/schema/beans/spring-beans.xsd  8  http://www.springframework.org/schema/context   9  http://www.springframework.org/schema/context/spring-context-4.0.xsd">10 11 <!-- 12  bean:节点:13  id:唯一14  class:装配需要的类,必须要有包名.类名15  16  //ioc setter注入17  <property name="属性的名称" value="属性的值"/> 普通变量的方式18  <property name="属性的名称" ref="beanId"/> 对象的方式19  前提:必须在类中生成setter方法即可,getter不需要.20  21  //ioc 构造函数注入22  <constructor-arg value="刘德华"></constructor-arg>23  //ioc注解注入 @autowire24  //ioc接口注入25  接口注入,构造函数注入,setter注入也好都在干吗:赋值26  27   GeLi geLi = new KeKe("keke"); 28  -->29 <!-- 选演员 -->30  <bean id="liudehua" class="com.tz.ioc.LiuDeHua">31   <constructor-arg value="刘德华"></constructor-arg>32  </bean>33 34  <bean id="keke" class="com.tz.ioc.KeKe">35   <constructor-arg value="keke"></constructor-arg>36  </bean>37 38  <!-- 配置剧本  MoGongMovie moGongMovie = new MoGongMovie(geLi);-->39  <bean id="moGongMovie" class="com.tz.ioc.MoGongMovie">40   <!-- 必须生成set方法 ioc set注入 -->41   <property name="geLi" ref="liudehua"></property>42  </bean>43</beans>

2:IOC的类型
  a:构造函数注入
 
1/**2 * tzdesk系统平台3 * tzspring024 * com.tz.ioc5 * LiuDeHua.java6 * 创建人:xuchengfei 7 * 时间:2015年10月10日-下午9:09:38 8 * 2015潭州教育公司-版权所有9 */10package com.tz.ioc;11 12/**13 * 14 * LiuDeHua15 * 创建人:xuchengfei 16 * 时间:2015年10月10日-下午9:09:38 17 * @version 1.0.018 * 19 */20public class LiuDeHua extends GeLi {21 22 public LiuDeHua(){23 24 }25 26 public LiuDeHua(String name){27  super(name);28 }29}


  b:setter属性注入
 1/**2 * tzdesk系统平台3 * tzspring024 * com.tz.ioc5 * LiuDeHua.java6 * 创建人:xuchengfei 7 * 时间:2015年10月10日-下午9:09:38 8 * 2015潭州教育公司-版权所有9 */10package com.tz.ioc;11 12/**13 * 14 * LiuDeHua15 * 创建人:xuchengfei 16 * 时间:2015年10月10日-下午9:09:38 17 * @version 1.0.018 * 19 */20public class MoGongMovie {21 22 private GeLi geLi;23 24 public MoGongMovie(){25 26 }27 28 //构造函数注入29 public MoGongMovie(GeLi geLi){30  this.geLi = geLi;31 }32 33 34 35 /**36  * 叩城门37  * com.tz.ioc 38  * 方法名:responseAsk39  * 创建人:xuchengfei 40  * 手机号码:1507481643741  * 时间:2015年10月10日-下午9:09:59 42  * @param message 43  * 返回类型:void44  * @exception 45  * @since  1.0.046  */47 public void startMovie(){48  //选择一个演员49  geLi.responseAsk("墨者隔离");50 }51 52 53 //setter注入54 public void setGeLi(GeLi geLi) {55  this.geLi = geLi;56 }57 58}
3:Java基础知识(反射)和 类装载器 ---ClassLoader
 A:类装载器就是寻找类的字节码文件并构造出类在jvm内部表示的对象组件,在Java中,类装载器吧一个类装入到 jvm中,要经过以下步骤:
 类装载:负责查询和加载class文件
 
B:链接:执行校验,准备和解析步骤,其中解析步骤是可以选择的:
 a:校验:检查载入class文件数据的正确性。
 b:准备:给类静态变量分配存储空间。
 c:解析:讲符号引用转成直接引用。

C:初始化,对静态变量,静态代码库执行初始化工作。

 1/**2 * tzdesk系统平台3 * tzspring024 * com.tz.reflect5 * ReflectDemo.java6 * 创建人:xuchengfei 7 * 时间:2015年10月10日-下午10:13:27 8 * 2015潭州教育公司-版权所有9 */10package com.tz.reflect;11 12import java.lang.reflect.Constructor;13import java.lang.reflect.Method;14import java.util.Map;15 16import com.tz.ioc.GeLi;17import com.tz.ioc.LiuDeHua;18import com.tz.ioc.MoGongMovie;19 20 21/**22 * 23 * ReflectDemo24 * 创建人:xuchengfei 25 * 时间:2015年10月10日-下午10:13:27 26 * @version 1.0.027 * 28 */29public class BeanRecflectDemo {30 31 /*32  * <!-- 选演员 -->33   <bean id="liudehua" class="com.tz.ioc.LiuDeHua">34    <constructor-arg value="刘德华"></constructor-arg>35   </bean> <!-- GeLi geLi = new KeKe("keke"); -->36 37   <bean id="keke" class="com.tz.ioc.KeKe">38    <constructor-arg value="keke"></constructor-arg>39   </bean>40   <!-- 配置剧本  MoGongMovie moGongMovie = new MoGongMovie(geLi);-->41   <bean id="moGongMovie" class="com.tz.ioc.MoGongMovie">42    <!-- 必须生成set方法 ioc set注入 -->43    <property name="geLi" ref="liudehua"></property>44   </bean>45  * 46  * */47 48 public static void main(String[] args) {49 50  try {51   //创建刘德华对象52   ClassLoader liudehuaClassLoader = Thread.currentThread().getContextClassLoader();53   Class clz  = liudehuaClassLoader.loadClass("com.tz.ioc.LiuDeHua");54 55   //解析构造函数56   Constructor[] constructors = clz.getDeclaredConstructors();57   com.tz.ioc.LiuDeHua liudehua = (com.tz.ioc.LiuDeHua) constructors[1].newInstance("刘德华");58 59   //创建keke对象60   ClassLoader kekeClassLoader = Thread.currentThread().getContextClassLoader();61   Class kclz  = liudehuaClassLoader.loadClass("com.tz.ioc.KeKe");62   //解析构造函数63   Constructor[] kconstructors = kclz.getDeclaredConstructors();64   com.tz.ioc.KeKe keke = (com.tz.ioc.KeKe) kconstructors[1].newInstance("keke");65 66 67   //剧本68   ClassLoader jubenClassLoader = Thread.currentThread().getContextClassLoader();69   Class jclz  = jubenClassLoader.loadClass("com.tz.ioc.MoGongMovie");70   MoGongMovie moGongMovie = (MoGongMovie) jclz.newInstance();71 72 73   Method method = jclz.getDeclaredMethod("setGeLi",GeLi.class);74   method.invoke(moGongMovie, keke);75 76 77   moGongMovie.startMovie();78 79  } catch (Exception e) {80   e.printStackTrace();81  }82 83 }84}

4:资源访问和加载Resource 
 


为了访问不同类型的资源,必须使用相应的Resource实现类,这是比较麻烦的,是否可以在不显示使用Resource实现类的情况下,进通过资源地方特殊表示就可以加载相应的资源文件呢?Spring通过了强大的加载资源的进制,不但能够通过classpath: file:等可以通过ant风格访问资源地址。

其中在classpath:对应的还有一种写法就是classpath*:,这个是什么含义呢,如果在一个项目中有个包com.tz.config存放了我们需要加载的资源文件。那么
classpath:com/tz/config/bean.xml 只会加载第一个,如果一个项目中有多个com.tz.config包的话就会加载所有包下面的资源文件.
假如项目中有三个模块分别资源文件都放入了在com.tz.config目录下分别是bean1.xml,bean2.xml,bean3.xml 。
使用classpath*:com/tz/config/bean*.xml 可以成功加载三个模块的配置文件。而使用classpath:com/tz/config/bean*.xml只会加载第一个模块的配置文件。
使用Ant风格资源地址支持3中匹配符:
? : 匹配文件名中一个字符
*:匹配文件名中任意个字符
**:匹配多层路径
如下:
classpath:com/tz/bean/bean?xml 可以匹配这个目录下com/tz/bean/bean.xml/ bean2.xml
classpath:com/tz/b?an/bean.xml 可以匹配这个目录下com/tz/bzan/bean.xml,com/tz/bCan/bean.xml等
classpath:com/*.xml :匹配所有的com下面的文件,记住了不包含孙子类元素
classpath:com/**/bean.xml 匹配所有的com下面的文件,
包含孙子类元素下所有的bean.xml的资源文件。比如:com/tz/bean.xml,com/tz/config/bean.xml 并且包括com/bean.xml

Spring资源加载器:



Spring的ResourceLoader接口仅有一个getResource(String location)的方法,可以根据一个资源地址加载文件资源,不过如果支持Ant风格的资源文件的加载的话,就扩展了一个ResourcePatternResolver的子类,定义了一个getResources(String location)的方法,可以加载ant风格路径的多文件,(想象一下:里面肯定是一个递归加循环的操作,你们说呢)。PathMatchingResourcePatternRessolver是Spring提供的标准实现,专门用来加载和解析配置文件的。1public static void main(String[] args) {2  /*3   * 结构如下:4   * /tzspring02/src5   com.tz6    com.tz.ioc7     /tzspring02/src/com/tz/ioc/Director.java8     /tzspring02/src/com/tz/ioc/GeLi.java9     /tzspring02/src/com/tz/ioc/KeKe.java10     /tzspring02/src/com/tz/ioc/LiuDeHua.java11     /tzspring02/src/com/tz/ioc/MoGongMovie.java12     /tzspring02/src/com/tz/ioc/Test.java13     /tzspring02/src/com/tz/ioc/bean.xml14   com.tz.ioc215    /tzspring02/src/com/tz/ioc2/Test.java16    /tzspring02/src/com/tz/ioc2/bean.xml17   com.tz.reflect18    /tzspring02/src/com/tz/bean.xml19   * 20   * */21 22  try {23   ResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver();24   Resource[] resources = patternResolver.getResources("classpath:com/tz/**/*.xml");25   for (Resource resource : resources) {26    System.out.println(resource.getFile().getAbsolutePath()+"==="+resource.getDescription()+"=="+resource.getFilename());27   }28  } catch (IOException e) {29   e.printStackTrace();30  }31 32  /*33   * 打印结果如下:34   *  D:\tzprojects\tzspring02\WebRoot\WEB-INF\classes\com\tz\bean.xml===file [D:\tzprojects\tzspring02\WebRoot\WEB-INF\classes\com\tz\bean.xml]==bean.xml35   D:\tzprojects\tzspring02\WebRoot\WEB-INF\classes\com\tz\ioc\bean.xml===file [D:\tzprojects\tzspring02\WebRoot\WEB-INF\classes\com\tz\ioc\bean.xml]==bean.xml36   D:\tzprojects\tzspring02\WebRoot\WEB-INF\classes\com\tz\ioc2\bean.xml===file [D:\tzprojects\tzspring02\WebRoot\WEB-INF\classes\com\tz\ioc2\bean.xml]==bean.xml37   * 38   * */39 }
0 0
原创粉丝点击