本文是转载文章,文章的来源:csdn博客
博主:李阿昀
转载文章: Spring的概述
转载原文地址:http://blog.csdn.net/yerenyuan_pku/article/details/69663685
转载说明:转载"spring的概述"的前面部分的内容
Spring的概述
什么是Spring
据度娘所载:
Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。
Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。
为什么说Spring是一个一站式的轻量级开源框架呢?EE开发可分成三层架构,针对JavaEE的三层结构,每一层Spring都提供了不同的解决技术。
- WEB层:SpringMVC
- 业务层:Spring的IoC
- 持久层:Spring的JDBCTemplate(Spring的JDBC模板,ORM模板用于整合其他的持久层框架)
从上面的简要介绍中,我们要知道Spring的核心有两部分:
- IoC:控制反转。
举例来说,在之前的操作中,比方说有一个类,我们想要调用类里面的方法(不是静态方法),就要创建类的对象,使用对象调用方法实现。对于Spring来说,Spring创建对象的过程,不是在代码里面实现的,而是交给Spring来进行配置实现的。 - AOP:面向切面编程。
之前,讲Struts2框架的拦截器时,我们就已稍微讲了一下,在Spring学习过程中,我们会着重来讲它。但是本文并不会过多阐述它,下文再讲。
为什么Spring
- 方便解耦,简化开发。
Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护,交给Spring管理。 - AOP编程的支持
Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。 - 声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无须手动编程。 - 方便程序的测试
Spring对Junit4支持,可以通过注解方便的测试Spring程序。 - 方便集成各种优秀的框架
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts2、Hibernate、MyBatis、Quartz等)的直接支持。 - 降低JavaEE API的使用难度
Spring对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。
Spring的版本
我这儿使用的Spring的版本是spring-framework-4.2.4.RELEASE。
Spring的入门案例
IOC的底层实现原理
IOC:Inversion of Control,控制反转。指的是对象的创建权反转(交给)给Spring,其作用是实现了程序的解耦合。也可这样解释:获取对象的方式变了。对象创建的控制权不是“使用者”,而是“框架”或者“容器”。
用更通俗的话来说,IOC就是指对象的创建,并不是在代码中用new操作new出来的,而是通过Spring进行配置创建的。其底层实现原理是XML配置文件+SAX解析+工厂设计模式。
就拿持久层(也即dao(data access object,数据访问对象)层)的开发来说,官方推荐做法是先创建一个接口,然后再创建接口对应的实现类。
先创建一个Userdao接口
public interface UserDao {
public void add();
}
再创建Userdao接口的UserDaoImpl实现类
public class UserDaoImpl implements UserDao {
public void add() {
balabala......
}
}
接着我们在service层调用dao层,核心代码如下:
// 接口 实例变量 = new 实现类
UserDao dao = new UserDaoImpl();
dao.add();
可发现缺点:service层和dao层耦合度太高了。解决方法是使用工厂模式进行解耦合操作。
创建一个工厂类,在工厂类中提供一个方法,返回实现类的对象。
public class Factory {
// 提供返回实现类对象的方法
public static UserDao getUserDaoImpl() {
return new UserDaoImpl();
}
}
然后在service层调用dao层的核心代码就变为:
UserDao dao = Factory.getUserDaoImpl();
dao.add();
如若这样做,会发现又产生了一个缺点:service层和工厂类又耦合了。所以使用工厂模式进行解耦合也只是一种权宜之计。下面我就来简单讲讲Spring IOC的底层实现原理:
-
配置文件中可能会有如下配置信息:
<bean id="userDaoImpl" class="cn.itcast.dao.impl.UserDaoImpl" />
-
也是要创建一个工厂类,在工厂类中提供一个返回实现类对象的方法,但并不是直接new实现类,而是使用SAX解析配置文件,根据标签bean中的id属性值得到对应的class属性值,使用反射创建实现类对象。
public class Factory { public static UserDao getUserDaoImpl() { // 1.使用SAX解析得到配置文件内容 // 直接根据id值userDaoImpl得到class属性值 String classvalue = "class属性值"; // 2.使用反射得到对象 Class clazz = Class.forName(classvalue); UserDaoImpl userDaoImpl = (UserDaoImpl)lazz.newInstance(); return userDaoImpl; } }
面向对象设计的七大原则
这里我稍微讲一下面向对象设计的七大原则,不必强记,重在理解。
- 单一职责原则(Single Responsibility Principle):每一个类应该专注于做一件事情。
- 里氏替换原则(Liskov Substitution Principle):超类存在的地方,子类是可以替换的。
- 依赖倒置原则(Dependence Inversion Principle):实现尽量依赖抽象,不依赖具体实现。
- 接口隔离原则(Interface Segregation Principle):应当为客户端提供尽可能小的单独的接口,而不是提供大的总的接口。
- 迪米特法则(Law Of Demeter):又叫最少知识原则,一个软件实体应当尽可能少的与其他实体发生相互作用。
- 开闭原则(Open Close Principle):面向扩展开放,面向修改关闭。
- 组合/聚合复用原则(Composite/Aggregate Reuse Principle CARP):尽量使用组合/聚合达到复用,尽量少用继承。原则: 一个类中有另一个类的对象。
Spring的IOC入门
步骤一:下载Spring的开发包
Spring的官网是http://spring.io。Spring的开发包的下载地址是http://repo.springsource.org/libs-release-local/org/springframework/spring,上面说过,我下载的是spring-framework-4.2.4.RELEASE。解压缩之后,可发现Spring开发包的目录结构如下:
- docs:API和开发规范
- libs:Jar包和源码
- schema:约束
步骤二:创建Web项目,引入Spring的开发包
从下图可知:
由于我们只是初次入门Spring,所以也只是使用Spring的基本功能,所以需要使用到下面的这4个Jar包:
除此之外,还要导入Spring支持的日志Jar包:
步骤三:编写相关的类,在类中创建方法
在src目录下创建一个cn.itcast.ioc包,并在该包下创建一个User类。
public class User {
public void add() {
System.out.println("add.................");
}
}
步骤三:创建Spring配置文件
注意:Spring配置文件的名称和位置没有固定要求,一般建议把该文件放到src下面,名称可随便写,官方建议写成applicationContext.xml。但我觉得这个文件名称太长了,所以决定写为bean1.xml。然后我们还需要在配置文件中引入约束,Spring学习阶段的约束是schema约束。那么问题来了,这个约束又该怎么写呢?可参考docs\spring-framework-reference\html
目录下的xsd-configuration.html文件,在其内容最后找到如下内容:
<?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="foo" class="x.y.Foo">
<meta key="cacheName" value="foo"/>
<property name="name" value="Rick"/>
</bean>
</beans>
然后将其复制黏贴到配置文件bean1.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.xsd">
</beans>
步骤四:在配置文件中配置对象的创建
<!-- 1.配置user对象的创建 -->
<bean id="user" class="cn.itcast.ioc.User"></bean>
步骤五:编写测试程序
我们要在Spring中写代码来实现获取bean1.xml文件中配置的对象(该段代码不要求重点掌握,只是用在测试中而已)。这段代码主要用来解析Spring配置文件得到对象,但这个过程不需要我们写代码实现,Spring封装了一个对象帮我们进行了这些操作,这个对象叫ApplicationContext,它就能实现这个功能。
在cn.itcast.ioc包下创建一个TestIOC单元测试类,如下:
public class TestIOC {
// 得到配置的user对象
@Test
public void demo1() {
// 1.加载Spring配置文件,把配置文件中的对象进行创建
ApplicationContext context =
new ClassPathXmlApplicationContext("bean1.xml"); // classpath:类路径,src目录下的文件最终要编译到类路径下
// 2.根据配置文件的id得到user对象
User user = (User) context.getBean("user");
System.out.println(user);
user.add();
}
}
注意:classpath为类路径,src目录下的文件最终要编译到类路径下。