Java程序员之Spring(一) 入门
一. Spring 原理讲解
Spring 是一个轻量容器框架(开源);Spring的核心是 IoC(控制反转) 和 AOP(面向切面编程);
Spring 由7个模块组成:
- Spring Core(核心容器):核心容器提供 Spring 框架的基本功能;
- Spring Context(Spring 上下文):Spring 上下文是一个配置文件,向 Spring框架提供上下文信息;
- Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能集成到了 Spring 框架中;
- Spring DAO:JDBCDAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息;
- Spring ORM:Spring 框架插入了若干个ORM框架,从而提供了 ORM 的对象关系工具,其中包括JDO、Hibernate和iBatisSQL Map;
- Spring Web:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文;
- Spring MVC框架:MVC框架是一个全功能的构建 Web应用程序的 MVC 实现;
√ 什么是框架?
- 解释一:制定一套规范或者规则(思想),大家(程序员)在该规范或者规则(思想)下工作;
- 解释二:一些牛人前辈或对牛人前辈的总结而出的一套解决方案;
二. Spring IoC (控制反转)
控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。
设计原理:把耦合从代码中移出去,放在同一的 XML 文件中,通过一个容器在需要的时候把这个依赖关系实现,及把需要的接口实现注入到需要它的类中。
IoC 中最基本的 Java 技术就是"反射"编程,反射编程方式相对于正常的编程方式要慢十几倍,通过 SUN 改良之后反射方式生成的对象和普通方式生成的对象相差不大了(依然有一倍以上的差距);
控制反转一般分为两种类型
- 依赖注入(Dependency Injection,简称DI): 组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。容器全权负责的组件的装配,它会把符合依赖关系的对象通过JavaBean属性或者构造函数传递给需要的对象。通过JavaBean属性注射依赖关系的做法称为设值方法注入(Setter Injection);将依赖关系作为构造函数参数传入的做法称为构造器注入(Constructor Injection);
- 依赖查找(Dependency Lookup): 容器提供回调接口和上下文条件给组件。EJB和Apache Avalon 都使用这种方式。这样一来,组件就必须使用容器提供的API来查找资源和协作对象,仅有的控制反转只体现在那些回调方法上(也就是上面所说的 类型1):容器将调用这些回调方法,从而让应用代码获得相关资源.
三. Spring AOP (面向切面变成)
AOP 是 Aspect Oriented Programming的缩写;AOP同OOP都是一种编程思想,且AOP 实际上是OOP的一种延续,我们用类比法进行理解:
AOP 同 OOP 的关联:1. 都是编程思想;
AOP 同 OOP 的区别:1. OOP关注的是纵向业务,而AOP关注的是横向业务;
2. 从业务角度来说,OOP 是对实体业务属性和行为进行抽象封装,AOP面对的是在处理过程中的某个步骤或阶段;
说明:
上图中将国内商务部、国际商务部和广告制作部归并(抽象)到商务部,以及将开发部、测试部、设计部归并(抽象)到技术部是用到了OOP 的编程思想;
国际商务部、国内商务部和开发部都有访问客户的业务,广告制作部和设计部,此时用抽象无法形象体现出来(同一类中的其他部门没有对应的业务),这里就可以使用AOP 编程思想;
四. Spring 模块说明
Spring 框架是一个分层架构,由7个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 Bean 的方式;组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。
Bean的概念:由 IoC 容器管理的那些组成你应用程序的对象;Bean 是 Spring 管理的基本单位,在基于Spring 的 Java EE 应用中,所有的组件都被当成Bean 处理(包括数据源、Hibernate的SessionFactory、事物管理器等)。Bean 就是由 Spring 容器初始化、装配及管理的对象,除此之外,bean 就与应用程序中其他对象没有什么区别了。
1. Spring Core (核心容器):
概念理解:核心容器提供 Spring 框架的基本功能(Spring Core)。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory 使用 IoC 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
实际应用:Spring 有两个核心接口(BeanFactory 和 ApplicationContext),其中ApplicationContext 是BeanFactory 的子接口。他们都可代表 Spring 容器,Spring 容器是生成 Bean 实例的工厂,并且管理容器中的 Bean。
- 1. 定义接口
public interface HelloService {
public void sayHello();
}
- 2. 定义接口实现类
public class HelloServiceImpl implements HelloService{
public void sayHello(){
System.out.println("Hello World!");
}
}
- 3. 在配置文件(helloworld.xml)中注册Bean信息
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- id 表示组件的名字,class表示组件类 -->
<bean id="helloService" class="com.ljq.test.HelloServiceImpl" /> </beans>
- 4. 应用
public class HelloServiceTest {
@Test
public void testHelloWorld() {
// 1、读取配置文件实例化一个IOC容器
ApplicationContext context = new ClassPathXmlApplicationContext("helloworld.xml");
// 2、从容器中获取Bean,注意此处完全“面向接口编程,而不是面向实现”
HelloService helloService = context.getBean("helloService", HelloService.class);
// 3、执行业务逻辑
helloService.sayHello();
}
}
说明:上诉 1-4 即为一个Spring Bean 的实际应用;其实就是如下4个步骤
- 定义服务层代码
- 在配置文件中进行声明
- 读取配置文件实例化一个 IOC 容器(这里有复杂的源码,另作分析)
- 从容器中获取Bean
- 执行业务逻辑
ApplicationContext经常用到的三个实现:
- 1.ClassPathXmlApplicationContext:从类路径中的XML文件载入上下文定义信息。把上下文定义文件当成类路径资源。
- 2.FileSystemXmlApplicationContext:从文件系统中的XML文件载入上下文定义信息。
- 3.XmlWebApplicationContext:从Web系统中的XML文件载入上下文定义信息。
2. Spring Context (Spring 上下文):
Spring 上下文是一个配置文件,向 Spring框架提供上下文信息。Spring 上下文包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度功能。
在spring使用过程中,通常的做法是让服务器启动时即实例化所有的bean,这样做在一定程度上提高了web应用的速度。
要配置在服务器启动加载applicationcontext通常有两种方法:
- ContextLoaderListener 具体配置是在web.xml中增加:
<listener>
<listener-class> org.springframework.web.context.ContextLoaderListener </listener-class>
</listener>
- ContextLoaderServlet 具体配置是在web.xml中增加:
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>
org.springframework.web.context.ContextLoaderServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
无论通过上面的哪一种配置都可以达到服务器启动即实例化bean的目的,如果要想指定applicationContext.xml的位置可以在增加:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/appContext.xml</param-value>
</context-param>
通过以上配置就可以达到在服务器启动时实例化指定的applicationContext.xml配置文件了。
3. Spring AOP
通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中
4. Spring DAO
JDBCDAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
说明:针对1-7的详细应用在接下来的章节中结合实例进行讲解
Java程序员之Spring(一) 入门的更多相关文章
- 为 Java 程序员准备的 Go 入门 PPT
为 Java 程序员准备的 Go 入门 PPT 这是 Google 的 Go 团队技术主管经理 Sameer Ajmani 分享的 PPT,为 Java 程序员快速入门 Go 而准备的. 视频 这个 ...
- 来自Java程序员的Python新手入门小结
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Java 程序员的大数据入门指南
项目 GitHub 地址:https://github.com/heibaiying/BigData-Notes ✒️ 前 言 大数据常用技术栈思维导图 大数据常用软件安装指南 一.Hadoop 分布 ...
- Java程序员之JS(一) 入门
背景:使用了JS做一个 WEB 项目之后,一直有使用JS 的一个功能,突然某一天项目重新规划,开始自己手动写一些原始JS,情况不妙,原来之前一直是用同事搭建好的框架在开发,对 JS 零基础的我一直在 ...
- Java程序员快速入门Go语言
这篇文章帮助Java程序员快速入门Go语言. 转载至 开源中国社区. http://www.oschina.net 本文将以一个有代表性的例子为开始,以此让Java程序员对Go语言有个初步认识,随后将 ...
- java程序员入门:英语好不好对编程到底有没有影响
我想当码农,听说钱钱拿的多! 哦.是很有钱!么样? 可是我不会! 那你想么样?去学撒! 可是,我英语差-- 有多差??? 很差-- 那????? 关于英语水平对编程的影响,我们一起来看看啦!希望可以解 ...
- Efficient&Elegant:Java程序员入门Cpp
最近项目急需C++ 的知识结构,虽说我有过快速学习很多新语言的经验,但对于C++ 老特工我还需保持敬畏(内容太多),本文会从一个Java程序员的角度,制定高效学习路线快速入门C++ . Java是为了 ...
- Java程序员的Golang入门指南(下)
Java程序员的Golang入门指南(下) 4.高级特性 上面介绍的只是Golang的基本语法和特性,尽管像控制语句的条件不用圆括号.函数多返回值.switch-case默认break.函数闭包.集合 ...
- Java程序员的Golang入门指南(上)
Java程序员的Golang入门指南 1.序言 Golang作为一门出身名门望族的编程语言新星,像豆瓣的Redis平台Codis.类Evernote的云笔记leanote等. 1.1 为什么要学习 如 ...
随机推荐
- C# 处理 JSON 常用的帮助类
C#请求接口的方法,具体代码: 首先需要添加引用和第三方的组件,具体如下: 引用命名空间: using System.IO; using Newtonsoft.Json.Linq; using Sys ...
- spring 核心接口之 Ordered
Spring中提供了一个Ordered接口.从单词意思就知道Ordered接口的作用就是用来排序的.Spring框架是一个大量使用策略设计模式的框架,这意味着有很多相同接口的实现类,那么必定会有优先级 ...
- js 时差转换 getTimezoneOffset()
如果我们的应用是针对世界各地的,当要把后台(服务器)存的时间展示给不同地区的用户时,这个时间应该经过时差转换. 转成用户客户端本地的时间,然后呈现给用户,即下面用到的getTimezoneOffset ...
- jQuery实现点击式选项卡
参考:jQuery权威指南jQuery初步jQuery选择器jQuery操作domjQuery操作dom事件jQuery插件jQuery操作AjaxjQuery动画与特效jQuery实现导航栏jQue ...
- JSP的EL和JSTL解析
1. EL 简介EL 全名为Expression Language,所有EL都是以${ 为起始.以} 为结尾的.EL 语法很简单,它最大的特点就是使用上很方便. 接下来介绍EL 主要的语法结构: ${ ...
- Vue学习笔记 ——computed VS methods
对于最终的结果,两种方式确实是相同的.然而,不同的是计算属性是基于它们的依赖进行缓存的.计算属性只有在它的相关依赖发生改变时才会重新求值.这就意味着只要 message 还没有发生改变,多次访问 re ...
- caffe学习笔记教程
1 官网:http://caffe.berkeleyvision.org/ 2 豆丁网中:http://www.docin.com/p-871820917.html 3 下载的caffe中,.../d ...
- 类的初始化__init__使用
初始化方法: 作用: 对新创建的对象添加属性 语法: class 类名(继承列表): def __init__(self [, 形参列表]): 语句块 [] 代表中的内容可省略 说明: 1. 实始化方 ...
- 从BZOJ2242看数论基础算法:快速幂,gcd,exgcd,BSGS
LINK 其实就是三个板子 1.快速幂 快速幂,通过把指数转化成二进制位来优化幂运算,基础知识 2.gcd和exgcd gcd就是所谓的辗转相除法,在这里用取模的形式体现出来 \(gcd(a,b)\) ...
- CaptureMouse/CaptureStylus 可能会失败
在 WPF 中,如果我们要做拖动效果,通常会调用一下 CaptureMouse/CaptureStylus 以便当鼠标或手指离开控件的时候依然能够响应 Move 和 Up 事件.不知有没有注意到这两个 ...