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 }
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
- Spring-IOC容器的概述-keke老师
- Spring IoC 容器概述
- 01.Spring Ioc 容器 - 概述
- spring的Ioc容器
- Spring的IoC容器
- spring的IOC容器
- Spring 的IOC 容器
- Spring学习3:IOC容器概述
- spring IOC容器和beans概述
- 第一篇 小曹学spring--IOC容器概述
- Spring 框架概述(三)之IoC 容器
- spring学习总结(二):IOC & DI 概述及 IOC 容器
- 模仿spring的IOC容器
- Spring 的 IOC 容器讲解
- Spring IOC容器的实现
- Spring-IOC容器的配置
- spring ioc容器的注入
- Spring框架的IOC容器
- IOS动画ViewAnimations
- 网格视图(GridView)的功能与用法
- Codility在线学习第一题学习过程
- sql根据字段查询重复记录
- 对properties文件进行读写
- Spring-IOC容器的概述-keke老师
- 【问题】 Navicat 2003-can't connect to MYSQL server on 'localhost'(10061)
- android 手机端 常用命令
- centos7 搭建Android开发环境(eclipse,adt,sdk)
- mongo集群配置
- ubuntu bash提示找不到文件或目录
- Android MotionEvent中getX()和getRawX()的区别
- java框架设计_替换
- DRBD+Heratbeat+NFS高可用文件共享存储