Spring用一种非入侵的方式来管理程序,模块结构图如下:

 

.Core层

IOC(控制反转):应用本身程序不负责依赖对象的创建及维护,依赖对象的创建及维护有外设容器负责,即:IOC;

DI(依赖注入):程序运行期间,外部容器动态的将依赖对象注入到另外的对象中,DI中强调的是注入方式;

与Core应用相关的jar包:commons-logging.jar、spring-beans.jar 、 spring-context.jar 、 spring-core.jar,其中commons-logging.jar是为了打印日志;

 

.启动IOC容器

1、AppliactionContext ac = new ClassPathXmlApplicationContext(new String[]{………..});

    类路径下加指定的Xml文件,其中参数为字符串数组,说明可同时加载多个路径下的XML文件;

2、ApplicationCOntext ac = new FileSystemXmlApplicationContext(new String[]{……..});

    文件路径下加载指定的Xml文件,其中参数为字符串数组,说明可同时加载多个路径下的XML文件

AppliactionContext被定义为接口,可视为制造对象的统一接口,XML文件加载后实例化的对象在内存中Key-Value的结构存储(Map),其中的Key为Xml文件中配置的对象ID(ID定义必须唯一);

<?xml version="1.0" encoding="UTF-8"?>
<beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean id="testID" class="cn.chenx.Test"/>

</beans>

 

public class TestSpring {
    public static void main(String[] args) {
        //启动springIOC容器
        ApplicationContext ac =
            new ClassPathXmlApplicationContext(new String[]{".../spring.xml"});
        Test test = (Test)ac.getBean("testID");
    }
}

 

.XML文件解析过程

加载指定路径下的 XML文件;

创建XML文件中配置的所有<bean />标签中指定类的对象,并加载进内存形成id与对象的键值对;

当<bean />标签下存在<property />标签时,接下该标签中的配置数据,并赋值给创建对象的对应属性字段;

如果<bean />标签之存在关系,设置对应的关系(这里的关系指对象之间引用);

 

.Bean的创建方式

1、无参构造创建对象(默认):

<bean id="UnitID" class="cn.chenx.spring.pojo.TestUnit"/>

class的值表示需要实例化类的类路径去掉.java后缀;

2、有参构造,通过辅助类静态方法创建对象:

<bean id="UnitID" class="cn.chenx.spring.pojo.HelpUnit" factory_method="createTestUnit"/>

class的值表示TestUnit的辅助类HelpUnit,createTestUnit为辅助类的静态方法,并返回TestUnit对象;

3、有参构造,通过辅助类非静态方法创建对象:

<bean id="HelpID" class="cn.chenx.spring.pojo.HelpFactory" />

<bean id="UnitID" factory_bean="HelpID" factory_method="createTestUnit"/>

HelpID表示辅助类ID,UnitID表示需创建对象的ID,createTestUnit为辅助的成员方法(非静态);

.Bean的生命周期

Bean的初始化和销毁的监听使用AbstractApplicationContext工厂类;

<bean id="UnitID" class="cn.chenx.spring.pojo.TestUnit"
          init-method="init"
          destroy-method="destroy"/>

init-method指定的方法在Bean对象初始化时调用,destroy-method指定的方法在Bean对象销毁是调用;

相关函数调用:

AbstractApplicationContext.close()立即销毁;

AbstractApplicationContext.registerShutDownHook延迟销毁,Java虚拟机停止时调用;

.Spring中的单例模式与原型模式

1、单例模式

<bean id="UnitID" class="cn.chenx.spring.pojo.TestUnit" scope="singleton" />

2、原型模式(默认)

<bean id="UnitID" class="cn.chenx.spring.pojo.TestUnit" scope="prototype" />

.Bean懒值实例化配置

<bean id="UnitID" class="cn.chenx.spring.pojo.TestUnit" lazy-init="true" />

初始化将被推迟,直到首次对它取值才实例化 , 默认情况下lazy-init="false",表示springIOC容器启动时,<bean />标签将被实例化;

.Bean继承关系配置

<bean id="parentID" class="cn.chenx.spring.pojo.ParentUnit">
    <property name="name" value="张三"/>
    <property name="sex"  value="男"/>
</bean>

<bean id="sonID" class="cn.chenx.spring.pojo.TestUnit" parent="parentID">
    <property name="name"     value="张五"/>
</bean>

父子关系通过 parent="parentID" 字段配置指定;

 

.Bean属性配置

1、构造器方式

Unit.java

public class Unit {
    private String name;
    private String value;
  

    public Unit(){

    }

    public Unit(String name,String value){
        this.name = name;
        this.value = value;
    }

}

spring.xml

<bean id="unitID" class="pojo.Unit">
    <constructor-arg index="0">
        <value>张三</value>
    </constructor-arg>
    <constructor-arg index="1">
        <value>5000</value>
    </constructor-arg>
</bean>

注:Unit的两个构造函数都必须存在,XML文件中 index的值,对应的是Unit类中有参构造函数中参数前后顺序类似数组的下标访问,如:name的下标为0,value下标为1;

 

2、set方式注入

Unit.java

public class Bean {
    private String name;
    private String info;

    //对应字段的get和set方法

}

public class Unit {
    private String uName;
    private Date uDate;
    private Set<String>  uSet;
    private List<String> uList;
    private Map<String, String> uMap;
    private Set<Bean>  beanSet;
    private List<Bean> beanList;
    private Map<Bean, Bean> beanMap;

    // 对应各个字段的get和set方法

}

spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans  xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

        <!-- Bean类中基本数据类型或包装数据类型字段name与info的设置 -->
        <bean id="beanId1" class="ioc.Bean">
            <property name="name" value="李一"></property>
            <property name="info" value="5000"></property>
        </bean>

        <bean id="udateId" class="java.util.Date" ></bean>

        <bean id="unitId" class="ioc.Unit" >
            <!-- Unit类中基本数据类型或包装数据类型字段uName值的设置 -->
            <property name="uName" value="张三" />

            <!-- Unit类中引用数据类型字段uDate值的设置 -->
            <property name="uDate" ref="udateId" />

            <!-- Unit类中Set集合数据类型字段uSet值的设置,且集合成员数据类型为基本数据类型 -->
            <property name="uSet" >
                <set>
                    <value>小学</value>
                    <value>中学</value>
                    <value>高中</value>
                    <value>大学</value>
                </set>
            </property>

            <!-- Unit类中List集合数据类型字段uList值的设置,且集合成员数据类型为基本数据类型 -->
            <property name="uList">
                <list>
                    <value>少先队员</value>
                    <value>共青团员</value>
                    <value>中共党员</value>
                    <value>毕业入职</value>
                </list>
            </property>

            <!-- Unit类中Map集合数据类型字段uMap值的设置,且集合成员数据类型为基本数据类型 -->
            <property name="uMap">
                <map>
                    <entry key="小学" value="少先队员"></entry>
                    <entry key="中学" value="共青团员"></entry>
                    <entry key="高中" value="中共党员"></entry>
                    <entry key="大学" value="毕业入职"></entry>
                </map>
            </property>

            <!-- Unit类中Set集合数据类型字段beanSet值的设置,且集合成员数据类型为引用数据类型 -->
            <property name="beanSet">
                <set>
                    <ref bean="beanId1" />
                </set>
            </property>

            <!-- Unit类中List集合数据类型字段beanList值的设置,且集合成员数据类型为引用数据类型 -->
            <property name="beanList">
                <list>
                    <ref bean="beanId1" />
                </list>
            </property>

            <!-- Unit类中Map集合数据类型字段beanMap值的设置,且集合成员数据类型为引用数据类型 -->
            <property name="beanMap">
                <map>
                    <entry key-ref="beanId1">
                        <ref bean="beanId1" />
                    </entry>
                </map>
            </property>
        </bean>

</beans>

Core层开发所需Jar包(Spring3.2):

asm-3.2.0.RELEASE.jar

com.springsource.org.apache.commons.logging-1.1.1.jar

spring-beans-3.2.0.RELEASE.jar

spring-context-3.2.0.RELEASE.jar

spring-core-3.2.0.RELEASE.jar

spring-expression-3.2.0.RELEASE.jar

spring-test-3.2.0.RELEASE.jar

Spring笔记(二)Core层的更多相关文章

  1. spring笔记(二)

    共性问题: 1. 服务器启动报错,什么原因? * jar包缺少.jar包冲突 1) 先检查项目中是否缺少jar包引用 2) 服务器: 检查jar包有没有发布到服务器下: 用户库jar包,需要手动发布到 ...

  2. spring笔记二

    DI—Dependency Injection,即“依赖注入”:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中.依赖注入的目的并非为软件系统带来更多功能,而是 ...

  3. spring cloud+dotnet core搭建微服务架构:服务发现(二)

    前言 上篇文章实际上只讲了服务治理中的服务注册,服务与服务之间如何调用呢?传统的方式,服务A调用服务B,那么服务A访问的是服务B的负载均衡地址,通过负载均衡来指向到服务B的真实地址,上篇文章已经说了这 ...

  4. spring cloud+.net core搭建微服务架构:服务发现(二)

    前言 上篇文章实际上只讲了服务治理中的服务注册,服务与服务之间如何调用呢?传统的方式,服务A调用服务B,那么服务A访问的是服务B的负载均衡地址,通过负载均衡来指向到服务B的真实地址,上篇文章已经说了这 ...

  5. Spring笔记01_下载_概述_监听器

    目录 Spring笔记01 1.Spring介绍 1.1 Spring概述 1.2 Spring好处 1.3 Spring结构体系 1.4 在项目中的架构 1.5 程序的耦合和解耦 2. Spring ...

  6. Spring 笔记 -06- 从 MySQL 建库到 登录验证数据库信息(maven)

    Spring 笔记 -06- 从 MySQL 建库到 登录验证数据库信息(maven) 本篇和 Spring 没有什么关系,只是学习 Spring,必备一些知识,所以放在这里了. 本篇内容: (1)M ...

  7. Spring笔记(6) - Spring的BeanFactoryPostProcessor探究

    一.背景 在说BeanFactoryPostProcessor之前,先来说下BeanPostProcessor,在前文Spring笔记(2) - 生命周期/属性赋值/自动装配及部分源码解析中讲解了Be ...

  8. jQuery源码笔记(二):定义了一些变量和函数 jQuery = function(){}

    笔记(二)也分为三部分: 一. 介绍: 注释说明:v2.0.3版本.Sizzle选择器.MIT软件许可注释中的#的信息索引.查询地址(英文版)匿名函数自执行:window参数及undefined参数意 ...

  9. Git 笔记二-Git安装与初始配置

    git 笔记二-Git安装与初始配置 Git的安装 由于我日常生活和工作基本上都是在Windows上,因此此处只说windows上的安装.Windows上的安装和其他程序一样,只需要到http://g ...

随机推荐

  1. Python基于比较的排序

    排序是算法学习中最基本的问题. 1.平均时间复杂度均为O(N2)的排序 1.1 插入排序 插入排序对少量元素的排序非常有效.工作机制就像打牌一样,为了将牌插入到已排好序的牌中,需要将牌与手中的牌从右向 ...

  2. httpcontext in asp.net unit test

    [TestMethod] [HostType("ASP.NET")] [UrlToTest("http://localhost:25153/qq/a.aspx" ...

  3. 【实用技巧】文件MD5修改方法

    方法一 利用md5修改器   更新日志:2011-10-6 22:00修正对于路径中存在空格修改无效的bug2011-10-6 20:17更新:1.回归简约界面2.直接拖拽即可捕获地址3.一键修改文件 ...

  4. ctf总结

    在过去的一个学期中,草人在西普学院还有一些其他安全夺旗网站上刷了一些题,草人我是菜鸟一个,刚开始很是苦恼,所以经历过以后希望将之分享给一起学习安全的同学,目的呢是希望以后学习的人能尽快理清学习思路,进 ...

  5. posix和system v有什么区别/?

    posix和system v有什么区别/?现在在应用时应用那一标准浮云484212 | 浏览 243 次 2014-11-06 10:362014-11-19 22:36 最佳答案们是有关信号量的两组 ...

  6. Welcome

    唔.你好! 这里是 Evensgn 的笔记本. 我是 SD 省的一名高中 OIer,从初中就接触了 OI ,然而水平一直是弱弱哒. Evensgn 是我常用的 ID. 不忘初心,方能始终. E-mai ...

  7. How to steal any developer's local database

    原文链接: http://bouk.co/blog/hacking-developers/ If you’re reading this and you’re a software developer ...

  8. zoj 3716

    题目给我们四个点,要求我们以这四个点为圆心,形成四个相切的圆: 求他们的半径和: 首先我们从他们中间选出三个点,以这三个点为圆心的三个圆最大可以两两互相相切: 证明:假设这三个圆的半径分别为a,b,c ...

  9. 年度十佳 DevOps 博客文章(后篇)

    如果说 15 年你还没有将 DevOps 真正应用起来,16 年再不实践也未免太落伍了.在上篇文章中我们了解到 15 年十佳 DevOps 博客文章的第 6-10 名,有没有哪一篇抓住了您的眼球,让您 ...

  10. 如何从软硬件层面提升 Android 动画性能?

    若是有人问如何解决动画性能不佳的问题,Dan Lew Codes 总会反问:你是否使用了硬件层? 动画放映过程中每帧画面可能都要重绘.如果使用视图层,,渲染过的视图可以存入离屏缓存以待将来重用,而无需 ...