Spring框架总结——第一部分

来源:互联网 发布:孙振耀。知乎 编辑:程序博客网 时间:2024/05/21 16:43

Spring框架的概述

Spring是分层的Java SE/EE应用 full-stack轻量级开源框架,以IoCInverse Of Control:反转控制)和AOPAspect Oriented Programming:面向切面编程)为内核,提供了展现层Spring MVC和持久层Spring JDBC以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的Java EE企业应用开源框架。

简单来说,是一个开源框架。让java开发模块化,并且全面。贯穿逻辑层,表现层,持久层。让每一个功能模块都可以独立分开,降低耦合,提高代码复用率!

IOC:控制反转:将创建对象的权利反转给Spring框架。

特点:

1、 IOC容器中存储的对象默认都是单例的,节省资源。

2、 启动服务器默认就把对象创建出来了,用的时候直接从容器中拿。提高效率。

3、  还可以使用依赖注入,简便开发。

4、  降低程序的耦合,提高维护性。

 

IOC的底层原理:利用工厂+配置文件模式来创建对象,并且存起来。

配置文件配置什么信息,工厂就创建什么对象。存到IOC容器中,要使用对象直接从容器中获取。

 

IOC入门:

关于配置文件的编写

名称和位置:随意定义名称,可放置随意位置。

一般推荐在类的根路径,名称为applicationContecxt.xml。

导入约束:

配置约束:

 

将资源(实现类)交给Spring框架的IOC容器去管理(创建对象):

<bean id=”” class=””/>      

默认情况下,调用的是该实现类的空参构造。如果没有空参构造则会创建失败。

 

主要属性:

属性id:唯一的字符串,对象的名称,要求必须是唯一的。

属性class:要IOC容器管理的实现类的全路径。用于反射创建对象。

 

其他属性:   

scope:指定对象的作用范围(作用范围)。

              一般属性取值是singleton:默认,单例的(加载配置文件时,对象就会产生。容器存在,对象就会一直存在)但是线程时安全的,因为不涉及成员属性的数据变化。只是单纯调用方法。

                                          prototype:多例的。每次访问对象时,会创建一个对象。

只有当对象在使用中,就会存在。如果对象长时间不用,就会被java的垃圾回收器回收了。

 

什么时候能用到多例的呢?

把action交给Spring矿框架的IOC容器去管理的时候,因为Action是多例。所以创建对象 必须得是多例的。

       想想为什么Action是多 例的?

因为两个请求使用同一个Action对象,当存储数据的时候,会引起安全问题。

 

init-method:指定类中初始化方法名称     

destroy-method:指定类中销毁方法名称

 

 

从工厂中获取对象——注意导包是Spring框架的包

 

//创建工厂

ApplicationContext ac = new ClassPathXmlApplicationContext(“applicationContext.xml”);

 

//根据配置文件的id值来获取对象

Object obj = ac.getBean(“id值”);//返回一个Object类型的对象,强转成想要的对象。

       一般,强转成的类型是实现类的接口类型。

 

关于ApplicationContext工厂和BeanFactory工厂:(工厂版本)

1、 BeanFactory工厂是Spring框架的容器中的顶层接口。

2、 ApplicationContext工厂是BeanFactory工厂的子接口。

两者区别:

创建对象时间不一样。

ApplicationContext:采用的是立即加载模式,只要一读取配置文件,就会创建对象。

BeanFactory:采用的是延迟加载模式,什么时候用到(获取)对象,什么时候才会创建对象。

 

注意ApplicationContext是一个接口,要创建对象得new它的实现类。它有两个实现类:

1.    ClassPathXmlApplicationContext类,它默认是从类的根目录下去读指定名称的配置文件,所以它的构造方法得传入一个字符串形式的文件名字(带后缀名)。

如果配置文件不在src下,它的构造方法得传入字符串型的配置文件路径。

只要一加载配置文件,就会把对象创建出来,并且存储。

2.    FileSystemXmlApplicationContext类:它是从磁盘上加载配置文件。

 

项目一般会把所有的配置文件放到项目中。所以推荐第一种加载方式。

 

依赖注入:

依赖注入时Spring框架IOC的具体实现。

简单来说,就是坐等框架把对象传入,不用我们自己去获取。

直接上代码演示

 

Set方法方式注入—最简单、最常用

/*

 * 使用依赖注入  CustomerDao对象注入到当前CustomerServiceImpl类中————使用set方法

 * 创建私有成员CustomerDao对象属性,然后提供set方法,并且在配置文件中进行配置

 */

public class CustomerServiceImpl implements CustomerService {

   

    //创建私有成员属性

    private CustomerDaocd;

    //提供set方法

    public void setCd(CustomerDao cd) {

       this.cd =cd;

    }

 

    @Override

    public void save() {

       // TODO Auto-generated method stub

       System.out.println("业务层爆粗了..");

       cd.save();

    }

 

}

 

<!-- CustomerServiceImpl类交给Spring框架的IOC容器去管理 -->

 <beanid="customerService"class="com.itheima.service.impl.CustomerServiceImpl">

   <!--CustomerServiceImpl类的cd属性注入customerDao对象值

name:找的是类中set方法后面的部分

           ref:给属性赋值是其他bean类型的

           value:给属性赋值是基本数据类型和string类型的

-->

   <propertyname="cd" ref="customerDao"/>

 </bean>

 <beanid="customerDao"class="com.itheima.dao.impl.CustomerDaoImpl"></bean>

  注入集合属性

给类中的集合成员传值,它用的也是set方法注入的方式,只不过变量的数据类型都是集合。

提供私有成员属性集合或者数组。

给成员集合或者数组提供set方法 

在配置文件中进行配置。

<bean id="customerService"class="com.itheima.service.impl.CustomerServiceImpl">

    <!-- 在注入集合数据时,只要结构相同,标签可以互换 -->

    <!-- 给数组注入数据 -->

    <propertyname="myStrs">

        <set>

            <value>AAA</value>

            <value>BBB</value>

            <value>CCC</value>

        </set>

    </property>

    <!-- 注入list集合数据 -->

    <propertyname="myList">

        <array>

            <value>AAA</value>

            <value>BBB</value>

            <value>CCC</value>

        </array>

    </property>

    <!-- 注入set集合数据 -->

    <propertyname="mySet">

        <list>

            <value>AAA</value>

            <value>BBB</value>

            <value>CCC</value>

        </list>

    </property>

    <!-- 注入Map数据 -->

    <propertyname="myMap">

        <props>

            <propkey="testA">aaa</prop>

            <propkey="testB">bbb</prop>

        </props>

    </property>

    <!-- 注入properties数据 -->

    <propertyname="myProps">

        <map>

            <entrykey="testA"value="aaa"></entry>

            <entrykey="testB">

                <value>bbb</value>

            </entry>

        </map>

    </property>

</bean>

    

原创粉丝点击