Spring-IOC容器的概述-keke老师
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 | } |
还没有评论,来说两句吧...