一. 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 异常层次结构。

 
 5. Spring ORM
  Spring 框架插入了若干个ORM框架,从而提供了 ORM 的对象关系工具,其中包括JDO、Hibernate和iBatisSQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
 
 6. Spring Web 模块
  Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
 
 7. Spring MVC 框架
  MVC框架是一个全功能的构建 Web应用程序的 MVC 实现。通过策略接口,MVC框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。模型由javabean构成,存放于Map;视图是一个接口,负责显示模型;控制器表示逻辑代码,是Controller的实现。Spring框架的功能可以用在任何J2EE服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同J2EE 环境(Web 或EJB)、独立应用程序、测试环境之间重用。
 

 说明:针对1-7的详细应用在接下来的章节中结合实例进行讲解

Java程序员之Spring(一) 入门的更多相关文章

  1. 为 Java 程序员准备的 Go 入门 PPT

    为 Java 程序员准备的 Go 入门 PPT 这是 Google 的 Go 团队技术主管经理 Sameer Ajmani 分享的 PPT,为 Java 程序员快速入门 Go 而准备的. 视频 这个 ...

  2. 来自Java程序员的Python新手入门小结

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. Java 程序员的大数据入门指南

    项目 GitHub 地址:https://github.com/heibaiying/BigData-Notes ✒️ 前 言 大数据常用技术栈思维导图 大数据常用软件安装指南 一.Hadoop 分布 ...

  4. Java程序员之JS(一) 入门

    背景:使用了JS做一个 WEB 项目之后,一直有使用JS 的一个功能,突然某一天项目重新规划,开始自己手动写一些原始JS,情况不妙,原来之前一直是用同事搭建好的框架在开发,对 JS 零基础的我一直在 ...

  5. Java程序员快速入门Go语言

    这篇文章帮助Java程序员快速入门Go语言. 转载至 开源中国社区. http://www.oschina.net 本文将以一个有代表性的例子为开始,以此让Java程序员对Go语言有个初步认识,随后将 ...

  6. java程序员入门:英语好不好对编程到底有没有影响

    我想当码农,听说钱钱拿的多! 哦.是很有钱!么样? 可是我不会! 那你想么样?去学撒! 可是,我英语差-- 有多差??? 很差-- 那????? 关于英语水平对编程的影响,我们一起来看看啦!希望可以解 ...

  7. Efficient&Elegant:Java程序员入门Cpp

    最近项目急需C++ 的知识结构,虽说我有过快速学习很多新语言的经验,但对于C++ 老特工我还需保持敬畏(内容太多),本文会从一个Java程序员的角度,制定高效学习路线快速入门C++ . Java是为了 ...

  8. Java程序员的Golang入门指南(下)

    Java程序员的Golang入门指南(下) 4.高级特性 上面介绍的只是Golang的基本语法和特性,尽管像控制语句的条件不用圆括号.函数多返回值.switch-case默认break.函数闭包.集合 ...

  9. Java程序员的Golang入门指南(上)

    Java程序员的Golang入门指南 1.序言 Golang作为一门出身名门望族的编程语言新星,像豆瓣的Redis平台Codis.类Evernote的云笔记leanote等. 1.1 为什么要学习 如 ...

随机推荐

  1. 重温ASP.NET WebAPI(一)初阶

    重温ASP.NET WebAPI(一)初阶   前言 本文为个人对WebApi的回顾无参考价值.主要简单介绍WEB api和webapi项目的基本结构,并创建简单地webaapi项目实现CRUD操作. ...

  2. sql 日志统计-日、周、月活跃数

    近日网站需求:统计日志表的 日.周.月活跃数.最终研究了出来了,分享给大家看下.  如果有更好的sql语句也可以评论下方. --日活跃量 ), cr.AddTime, )as addtimt,COUN ...

  3. hdu1151

    题解: 二分图边覆盖 n-最大匹配 代码: #include<cstdio> #include<cmath> #include<algorithm> #includ ...

  4. qml 与C++交互

    最近一直在研究qml 怎么与C++交互,今天在网上看到一段代码忽然想明白了,哦!!!我在QT还只是一个小白,嘿嘿 首先在我们定义了CPP文件起名:比如:util.cpp,baidumusic.cpp ...

  5. C# 解决串口接收数据不完整

    方法1: 使 用缓存机制完成.首先通过定义一个成员变量List<byte> buffer = new List<byte> (4096);用来存放所有的数据,在接收函数里,通过 ...

  6. 手机通过笔记本开的WIFI访问TOMCAT服务器站点示例

    我一直想用手机连上笔记本上的服务器TOMCAT,尝试了好久没连上,实验室一个妹子会这个技术,我也想学,自己摸索着学了几次,没成功,今晚想个办法试了一下,可以连接了,以后可以做手机网站开发了,这也是移动 ...

  7. Java调用本地方法又是怎么一回事

    JNI JNI即Java Native Interface,它能在Java层实现对本地方法的调用,一般本地的实现语言主要是C/C++,其实从虚拟机层面来看JNI挺好理解,JVM主要使用C/C++ 和少 ...

  8. swift metal ios8 关键字.

    swift metal ios8  关键字. 4000API. 无所谓谁打败谁吧. 行业内用户用的多 资源多 问题容易解决. 今年明显unity 火热程度非常. 然,万变不离其中. 对于游戏产品来说, ...

  9. learn go ifelse

    package main // 参考文档: // https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/05.1.md im ...

  10. 关于java日期

    时间戳转为yyyy-MM-dd SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String formatDa ...