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

谁借莪1个温暖的怀抱¢ 2022-08-18 00:45 225阅读 0赞

201510101939470.png Java

1:IOC的概述
IOC(控制反转 Inversion of Control ),是Spring容器的内核,Aop,事务申明等功能都是在ioc基础之上开花结果。主要解决的问题,代码解耦,设计模式,代码重构和优化等。

201510110108574.jpg

案例如下:在项目的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"&nbsp;
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  &nbsp;
7   http://www.springframework.org/schema/beans/spring-beans.xsd &nbsp;
8   http://www.springframework.org/schema/context  &nbsp;
9   http://www.springframework.org/schema/context/spring-context-4.0.xsd"&gt;
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

201510110109194.jpg

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

201510131711272.jpg

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 条评论,225人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringIOC容器

    1.什么是IOC IOC(Inversion of Control):其思想翻转资源获取的方向,传统的资源查找方法要求组件向容器发起请求查找资源,作为回应,容器适时

    相关 一步一步实现SpringIoc容器

    IoC(Inverse of Controll控制反转):指的是对象的创建方式进行了反转,传统的开发方式是程序员自己 new 对象,IoC就是将这一过程进行了反转,程序员不需要

    相关 SpringIOC 容器

    spring是可以解决对象创建以及对象之间依赖关系的一种框架。   通过添加模块,添加不同功能 1. Spring Core  spring的核心功能: IOC容器

    相关 并发容器概述

    同步类容器都是线程安全的,但在某些场景下可能需要加锁来保护复合操作。复合类操作如:迭代(反复访问元素,遍历完容器中所有的元素)、跳转(根据指定的顺序找到当前元素的下一个元素)、