Spring讨论班

来源:互联网 发布:微信公众平台seo 编辑:程序博客网 时间:2024/04/30 16:36

    • 简单回顾
        • 1什么是Spring框架
        • 2Spring框架有哪些特征
    • 环境初步搭建
      • 举个例子介绍框架
        • 普通写法
        • 框架写法
    • IOC和DI
        • IOC控制反转
        • DI依赖注入
    • IOC容器
        • IOC容器的基础
        • IOC容器的作用
        • IOC容器的实现
    • Bean作用域
    • 参考


简单回顾

1、什么是Spring框架?

Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用

Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。

2、Spring框架有哪些特征?

(1)轻量:完整的Spring框架可以在1MB多的JAR文件发布,而且是非侵入式的:Spring应用中的对象不依赖于Spring的特定类。
(2)控制反转(Inversion of Control ):促进低耦合,当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它

JNDI http://blog.csdn.net/zhaosg198312/article/details/3979435

(3)面向切面(Aspect Oriented Program):Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。

(4)容器:Spring**包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype)**,你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。
(5)框架:Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。

环境初步搭建

开发环境:idea

1、选择左侧箭头Create New Project,出现右侧弹框后,选择Spring,记得在右侧箭头处打钩,然后就可以Next。

这里写图片描述

2、Iidea会自动帮你下好Spring的jar包(所以上步操作需要联网)和spring-config.xml文件
这里写图片描述


举个例子介绍框架

普通写法:

1、创建一个实体类HelloJoiner,有三个属性name,grade,department以及对应的set方法为了输出重写了tostring方法。

这里写图片描述

2、创建一个TestHelloJoiner类,要输出HelloJoiner的实例化对象需要三步(如图)。
开启debug测试,发现在(1、创建对象时)初始化构造器,之后的set方法逐步调用。

这里写图片描述


框架写法

1、第一步实体类不用动,在spring-config里面加上(如下图)

<?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.xsd">    <bean id="helloJoiner" class="com.entity.HelloJoiner">        <property name="name" value="卓小音"></property>        <property name="grade" value="2015级"></property>        <property name="department" value="产品部"></property>    </bean></beans>

这里写图片描述
2、配置好HelloJoiner的信息后,要输出HelloJoiner的实例化对象也需要三步(如图)。
开启Debug,发现在(1、创建Spring的IOC对象时)就已经调用了初始化,和所有的set方法
这里写图片描述


IOC和DI

IOC控制反转

应用程序不再负责依赖对象的创建和维护,而是由外部容器负责创建和维护。

举一个例子:

在我们卓音工作室,每位部门成员都有一件属于自己部门的文化衫。

这里写图片描述

定义一个文化衫接口类

这里写图片描述

其中,前端,后端,产品部分别实现这个文化衫接口类

package com.entity.goods.impl;import com.entity.goods.CultureClothes;/** * FrontClothesImpl前端文化衫的实现类 * * @author zhaiaxin * @time: 2017/9/24 18:29. */public class FrontClothesImpl implements CultureClothes{    @Override    public void printClothes() {        System.out.println("my clothes has a cute lion");    }}

package com.entity.goods.impl;import com.entity.goods.CultureClothes;/** * BackClothesImpl后端文化衫的实现类 * * @author zhaiaxin * @time: 2017/9/24 18:26. */public class BackClothesImpl implements CultureClothes{    @Override    public void printClothes() {        System.out.println("my clothes has a cute orang");    }}

package com.entity.goods.impl;import com.entity.goods.CultureClothes;/** * ProductClothesImpl产品文化衫的实现类 * * @author zhaiaxin * @time: 2017/9/24 18:30. */public class ProductClothesImpl implements CultureClothes{    @Override    public void printClothes() {        System.out.println("my clothes has a cute dog");    }}

刚开始,身为一个正式的成员,必须在new自己的同时new自己部门的文化衫(找一件白短袖自己去画上自己部门的logo)

这里写图片描述

后来,由于潮流的改变,大家不满足于过去文化衫陈旧的款式,每年都想要最新样式的文化衫,但是每个人按照之前的方式再去自己new,这样做太过麻烦,于是把文化衫制作的任务交给服装厂。

这里写图片描述

大家只需要给服装厂说出自己的部门logo,就可以撒手不管了,很省事。

这里写图片描述

直到今天,卓音的成员已成为懒癌患者,连自己去联系服装厂做文化衫都懒得动,于是将全部的任务都交给一个负责人,负责人统一管理各个部门的文化衫。
这里写图片描述

当自己需要自己部门的文化衫时,给负责人说一下,负责人就分发给你。(负责人的作用就相当于IOC容器)

这里写图片描述

上述例子简要介绍了下IOC是怎么产生的。

首先就是当joiner需要一个cultureClothes对象的时候,这时候就产生了依赖关系,各种文化衫就是joiner的依赖对象,刚开始的时候,joiner需要依赖对象的时候,需要自己去new一个对象,这时候joiner和依赖对象的耦合度是最高的

在依赖对象类型多的时候,joiner来管理就变得很麻烦,所以后来就产生了工厂,采用工厂设计模式,把依赖对象的创建过程交给工厂去管理,我们只需要管理一个工厂就好,这时候person和依赖对象的耦合程度就降低了。

后来又产生了使用IOC容器去管理我们的依赖对象,这时候在我们的代码不会看到new依赖对象,只需要配置文件就好,通过IOC达到松耦合的目的,让Spring管理应用对象的配置和生命周期,而我们不需要去new对象。

DI依赖注入

构造注入

就是通过构造方法把依赖对象传入,在Spring配置文件这么写就好。 (图中Joiner的构造方法是有参方法,且参数是一个引用类型,若为基本类型,则把 <constructor-arg type="com.entity.goods.CultureClothes" ref="backClothes">
</constructor-arg>
中的ref属性改为value即可)
这里写图片描述

设值注入

设值注入就是通过setter方法把依赖的对象传入,在Spring中做如下配置即可。
这里写图片描述


IOC容器

IOC容器的基础

org.springframework.beansorg.springframework.context这两个包是IOC容器的基础,要使用Spring的IOC功能,需要导入这两个jars。

IOC容器的作用

这里写图片描述

IOC容器的主要作用就是管理我们beans,只需要我们把配置文件写好,IOC容器就会根据配置信息提供给我们想要的beans,在需要对象的时候可以直接和IOC容器去要,不需要手动去new一个对象。

IOC容器的实现

Spring提供了两种类型的IOC容器的实现:

BeanFactory:IOC容器的基本实现。他是访问bean的顶层接口,提供了能够管理任何类型的对象的高级配置机制,就是提供了配置bean的框架和一些基本的功能。

ApplicationContext 提供了更多高级特性,是BeanFactory的子接口,在BeanFactory的基础上添加了 许多企业专用的功能,它是BeanFactory的超集,所以大多数情况下org.springframework.context.ApplicationContext这个接口代表着IOC容器,它负责对象的实例化配置和装配。这是他们的继承关系:

这里写图片描述

ApplicationContext的两个主要实现类:

        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");//从ClassPath中加载XML配置文件
       ApplicationContext context1 = new FileSystemXmlApplicationContext("F:\\workSpace\\axin\\Spring\\src\\spring-config.xml");//从文件系统中加载XML配置文件

Bean作用域

默认作用域:单例模式scope="singleton"
这里写图片描述
1、 prototype:允许Bean的定义可以被实例化多次。每次调用都创建一个新的实例。
2、request:在一次http请求中,每个Bean对应一个实例。仅在基于web的Spring上下文中才有效。
3、 session:在一个HTTP Session中,每个Bean对应一个实例。仅在基于web的Spring上下文中才有效。
4、global-session:在一个全局的HTTP Session中,每个Bean对应一个实例。仅在Portlet上下文中才有效。

参考

Spring系列http://blog.csdn.net/cflys/article/category/6882976

Spring官方文档:https://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-introduction

原创粉丝点击