首页 > 代码库 > Spring笔记(二)Core层

Spring笔记(二)Core层

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中的单例模式配置(默认)

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

.Spring中的原型模式配置

<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=http://www.mamicode.com/"张三"/>
    <property name="sex"  value=http://www.mamicode.com/"男"/>
</bean>

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

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

Spring笔记(二)Core层