简单回顾
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">
中的ref属性改为value即可)
</constructor-arg>
设值注入
设值注入就是通过setter方法把依赖的对象传入,在Spring中做如下配置即可。
IOC容器
IOC容器的基础
org.springframework.beans
和org.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