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

4 篇文章 0 订阅
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注解注入 @autowire
24   //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  * tzspring02
4  * com.tz.ioc
5  * LiuDeHua.java
6  * 创建人:xuchengfei 
7  * 时间:2015年10月10日-下午9:09:38 
8  * 2015潭州教育公司-版权所有
9  */
10 package com.tz.ioc;
11  
12 /**
13  * 
14  * LiuDeHua
15  * 创建人:xuchengfei 
16  * 时间:2015年10月10日-下午9:09:38 
17  * @version 1.0.0
18  * 
19  */
20 public 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  * tzspring02
4  * com.tz.ioc
5  * LiuDeHua.java
6  * 创建人:xuchengfei 
7  * 时间:2015年10月10日-下午9:09:38 
8  * 2015潭州教育公司-版权所有
9  */
10 package com.tz.ioc;
11  
12 /**
13  * 
14  * LiuDeHua
15  * 创建人:xuchengfei 
16  * 时间:2015年10月10日-下午9:09:38 
17  * @version 1.0.0
18  * 
19  */
20 public 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   * 方法名:responseAsk
39   * 创建人:xuchengfei 
40   * 手机号码:15074816437
41   * 时间:2015年10月10日-下午9:09:59 
42   * @param message 
43   * 返回类型:void
44   * @exception 
45   * @since  1.0.0
46   */
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  * tzspring02
4  * com.tz.reflect
5  * ReflectDemo.java
6  * 创建人:xuchengfei 
7  * 时间:2015年10月10日-下午10:13:27 
8  * 2015潭州教育公司-版权所有
9  */
10 package com.tz.reflect;
11  
12 import java.lang.reflect.Constructor;
13 import java.lang.reflect.Method;
14 import java.util.Map;
15  
16 import com.tz.ioc.GeLi;
17 import com.tz.ioc.LiuDeHua;
18 import com.tz.ioc.MoGongMovie;
19  
20  
21 /**
22  * 
23  * ReflectDemo
24  * 创建人:xuchengfei 
25  * 时间:2015年10月10日-下午10:13:27 
26  * @version 1.0.0
27  * 
28  */
29 public 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/b z an/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提供的标准实现,专门用来加载和解析配置文件的。
1 public static void main(String[] args) {
2   /*
3    * 结构如下:
4    * /tzspring02/src
5    com.tz
6     com.tz.ioc
7      /tzspring02/src/com/tz/ioc/Director.java
8      /tzspring02/src/com/tz/ioc/GeLi.java
9      /tzspring02/src/com/tz/ioc/KeKe.java
10      /tzspring02/src/com/tz/ioc/LiuDeHua.java
11      /tzspring02/src/com/tz/ioc/MoGongMovie.java
12      /tzspring02/src/com/tz/ioc/Test.java
13      /tzspring02/src/com/tz/ioc/bean.xml
14    com.tz.ioc2
15     /tzspring02/src/com/tz/ioc2/Test.java
16     /tzspring02/src/com/tz/ioc2/bean.xml
17    com.tz.reflect
18     /tzspring02/src/com/tz/bean.xml
19    * 
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.xml
35    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.xml
36    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.xml
37    * 
38    * */
39  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值