【一头扎进Spring】 01 | 从 HelloWorld 开始看Spring
- Spring 是一个开源框架.
- Spring 为简化企业级应用开发而生. 使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能.
- Spring 是一个 IOC(DI) 和 AOP 容器框架.
开发环境
- 开发工具: IDEA
- JDK 8.0
- Spring 4.0
Spring 的简单介绍
具体描述 Spring:
- 轻量级:Spring 是非侵入性的 - 基于 Spring 开发的应用中的对象可以不依赖于 Spring 的 API
- 依赖注入(DI --- dependency injection、IOC)
- 面向切面编程(AOP --- aspect oriented programming)
- 容器: Spring 是一个容器, 因为它包含并且管理应用对象的生命周期
- 框架: Spring 实现了使用简单的组件配置组合成一个复杂的应用. 在 Spring 中可以使用 XML 和 Java 注解组合这些对象
- 一站式:在 IOC 和 AOP 的基础上可以整合各种企业应用的开源框架和优秀的第三方类库 (实际上 Spring 自身也提供了展现层的 SpringMVC 和 持久层的 Spring JDBC)
Spring 模块
核心容器(Core Container) 包括Core、Beans、Context、EL模块
- Core和Beans模块提供了Spring最基础的功能,提供IoC和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。
- Context模块基于Core和Beans来构建,它提供了用一种框架风格的方式来访问对象,有些像JNDI注册表。Context封装包继承了beans包的功能,还增加了国际化(I18N),事件传播,资源装载,以及透明创建上下文,例如通过servlet容器,以及对大量JavaEE特性的支持,如EJB、JMX。核心接口是ApplicationContext。
- Expression Language,表达式语言模块,提供了在运行期间查询和操作对象图的强大能力。支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从Spring 容器获取Bean,它也支持列表投影、选择和一般的列表聚合等。
数据访问/集成部分(Data Access/Integration)
- JDBC模块,提供对JDBC的抽象,它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码。
- ORM模块,提供了常用的"对象/关系"映射APIs的集成层。 其中包括JPA、JDO、Hibernate 和 iBatis 。利用ORM封装包,可以混合使用所有Spring提供的特性进行"对象/关系"映射,如简单声明性 事务管理 。
- OXM模块,提供一个支持Object和XML进行映射的抽象层,其中包括JAXB、Castor、XMLBeans、JiBX和XStream。
- JMS模块,提供一套"消息生产者、消费者"模板用于更加简单的使用JMS,JMS用于用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
- Transaction模块,支持程序通过简单声明性 事务管理,只要是Spring管理对象都能得到Spring管理事务的好处,即使是POJO,也可以为他们提供事务。
Web
- Web模块,提供了基础的web功能。例如多文件上传、集成IoC容器、远程过程访问、以及Web Service支持,并提供一个RestTemplate类来提供方便的Restful services访问
- Web-Servlet模块,提供了Web应用的Model-View-Controller(MVC)实现。Spring MVC框架提供了基于注解的请求资源注入、更简单的数据绑定、数据验证等及一套非常易用的JSP标签,完全无缝与Spring其他技术协作。
- Web-Struts模块, 提供了对Struts集成的支持,这个功能在Spring3.0里面已经不推荐了,建议你迁移应用到使用Struts2.0或Spring的MVC。
- Web-Portlet模块,提供了在Portlet环境下的MVC实现
AOP
- AOP模块,提供了符合AOP 联盟规范的面向方面的编程实现,让你可以定义如方法拦截器和切入点,从逻辑上讲,可以减弱代码的功能耦合,清晰的被分离开。而且,利用源码级的元数据功能,还可以将各种行为信息合并到你的代码中 。
- Aspects模块,提供了对AspectJ的集成。
- Instrumentation模块, 提供一些类级的工具支持和ClassLoader级的实现,可以在一些特定的应用服务器中使用。
Test
- Test模块,提供对使用JUnit和TestNG来测试Spring组件的支持,它提供一致的ApplicationContexts并缓存这些上下文,它还能提供一些mock对象,使得你可以独立的测试代码。
HelloWorld
首先创建一个 Maven 工程(也可以使用IDEA里面的那个 Spring . 这里初学,就不建议使用那个了。同样,建议创建 maven 工程,方便 Jar 包的管理);Maven工程大家就可以自己创建一个空白的 工程就行。
创建好我们的 Maven 工程后,我们需要配置好我们的 pom.xml 文件,引入我们的开发包。
<dependencies>
<!-- Spring Core-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring Context-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring Beans-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring Web-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring WebMvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring Aop-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
我们的父工程的搭建好了之后,就开始创建我们的子工程。我这取名: spring-learning-quickstart.子工程是继承父工程的,这样我们就不用再次导入我们的开发包了。
我们在 子工程中创建一个 bean , 取名 HelloWorld .
public class HelloWorld {
private String name ;
public void setName(String name) {
this.name = name;
}
public void sayHello(){
System.out.println("Hello " + name);
}
public HelloWorld() {
System.out.println("Constructor for HelloWorld");
}
}
然后,我们在创建一个主类 Main .
public class Main {
public static void main(String[] args) {
// 传统做法( 这不是Spring 的做法)
HelloWorld helloWorld = new HelloWorld();
helloWorld.setName("Spring");
helloWorld.sayHello();
}
}
一运行,我们就可以看到控制台出现了:
hello Spring
当然,这个不是 Spring 的方式。现在我们来看看 Spring 中怎么去做。
Spring 实现
在Spring 中,我们需要通过配置去实现我们的这个 HelloWorld 的。首先,我们在 resource 中新建一个 XML 的文件 。 我这就叫 applicationContext.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">
<!-- 配置Bean -->
<bean id="helloWorld" class="com.spring.bean.HelloWorld">
<property name="name" value="SunYang's Spring"></property>
</bean>
</beans>
这里稍后在解释。
然后我们在主类中,这么来写。
//1 创建 Spring 的 IOC 容器对象
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//2 从IOC 容器中获取 Bean 实例
HelloWorld hello = (HelloWorld)applicationContext.getBean("helloWorld");
//3 调用 sayHello()
hello.sayHello();
这样我们的控制台就出现:
hello SunYang's Spring
现在呢,先来看一下,Spring创建了这个容器的过程中帮我们做了什么。我们在这个容器创建这边打一个断点。
然后程序执行到这以后,会自动跳到我们的 HelloWorld 类里面,在看这个:
我们可以看到,这个时候Spring就已经把 SunYang's Spring 给了 name 了。
Spring 核心
两个重点概念
- IOC: 控制反转,与依赖注入 DI 一样
- AOP: 面向切面编程
IOC
所谓控制反转,其实是一个由主动转被动的一个过程。举个例子:
之前,我们没有饮品店的时候,我们想喝果汁了,就是自己准备水果,然后自己榨果汁。这就是一个主动的创造一杯果汁的过程。但是,现在有饮品店了,我们想喝果汁了,我们就不在需要自己去榨一杯果汁,而是叫饮品店去榨一杯果汁,请注意,这里我们并没有创造一杯果汁,但是依然达到了我们要喝果汁的目的。这边是控制反转的思想。比如说:
我现在要喝 一个 大杯的三分糖的橙子汁。
/**
* 我们要喝的水果汁
* @param water 果汁加的水
* @param fruit 水果类型
* @param sugar 糖
* @return
*/
public static String juiceMix(String water , String fruit ,String sugar){
String juice = String.format("我要喝 %s 的 , %s 的 %s" , water ,sugar ,fruit ) ;
return juice ;
}
现在我们有了要喝的果汁,现在就是需要有人去做,相当于一个店家去做。
public class JuiceProduce {
private String water ;
private String fruit ;
private String sugar ;
public void setWater(String water) {
this.water = water;
System.out.println(this.water);
}
public void setFruit(String fruit) {
this.fruit = fruit;
}
public void setSugar(String sugar) {
this.sugar = sugar;
}
public JuiceProduce() {
System.out.println("Constructor for JuiceProduce");
}
public String juiceProduce(){
return Blende.juiceMix(this.water , this.fruit , this.sugar) ;
}
}
现在我们需要选择那家店去喝这个果汁了,就是在 配置文件里面去配置一下。
<bean id="juiceProduce" class="com.spring.bean.JuiceProduce">
<property name="water" value="大杯" />
<property name="fruit" value="橙汁" />
<property name="sugar" value="三分糖"/>
</bean>
我们选择这个名叫 juiceProduce 的店家来制造我们的果汁。最后的结果就是:
我要喝 大杯 的 , 三分糖 的 橙汁
在下一篇中,讲一下这个关于 Bean 的配置问题。
【一头扎进Spring】 01 | 从 HelloWorld 开始看Spring的更多相关文章
- 一头扎进EasyUI3
惯例广告一发,对于初学真,真的很有用www.java1234.com,去试试吧! 一头扎进EasyUI第11讲 .基本下拉组件 <select id="cc" style=& ...
- 一头扎进EasyUI2
惯例广告一发,对于初学真,真的很有用www.java1234.com,去试试吧! 一头扎进EasyUI第6讲 .日历组件 <div class="easyui-calendar&quo ...
- 一头扎进EasyUI
惯例广告一发,对于初学真,真的很有用www.java1234.com,去试试吧! 一头扎进EasyUI第1讲 .加载库文件和样式 <link rel="stylesheet" ...
- 《一头扎进》系列之Python+Selenium框架设计篇3- 价值好几K的框架,狼来了,狼来了....,狼没来,框架真的来了
1. 简介 前边宏哥一边一边的喊框架,就如同一边一边的喊狼来了!狼来了!.....这回是狼没有来,框架真的来了.从本文开始宏哥将会一步一步介绍,如何从无到有地创建自己的第一个自动化测试框架.这一篇,我 ...
- 《一头扎进》系列之Python+Selenium框架设计篇4- 价值好几K的框架,呵!这个框架有点意思啊
1.简介 前面文章,我们实现了框架的一部分功能,包括日志类和浏览器引擎类的封装,今天我们继续封装一个基类和介绍如何实现POM.关于基类,是这样定义的:把一些常见的页面操作的selenium封装到bas ...
- 《一头扎进》系列之Python+Selenium框架设计篇5 - 价值好几K的框架,哎呦!这个框架还真有点料啊!!!
1. 简介 其实,到前面这一篇文章,简单的Python+Selenium自动化测试框架就已经算实现了.接下来的主要是介绍,unittest管理脚本,如何如何加载执行脚本,再就是采用第三方插件,实现输出 ...
- 《一头扎进》系列之Python+Selenium自动化测试框架实战篇6 - 价值好几K的框架,呦!这个框架还真牛叉哦!!!
1. 简介 本文开始介绍如何通过unittest来管理和执行测试用例,这一篇主要是介绍unittest下addTest()方法来加载测试用例到测试套件中去.用addTest()方法来加载我们测试用例到 ...
- 《一头扎进》系列之Python+Selenium框架实战篇7 - 年底升职加薪,年终奖全靠它!Merry Christmas
1. 简介 截止到上一篇文章为止,框架基本完全搭建完成.那么今天我们要做什么呢????聪明如你的小伙伴或者是童鞋一定已经猜到了,都测试完了,当然是要生成一份高端大气上档次的测试报告了.没错的,今天宏哥 ...
- 一头扎进Spring之---------Spring七大核心模块
Spring七大核心模块 核心容器(Spring Core) 核心容器提供Spring框架的基本功能.Spring以bean的方式组织和管理Java应用中的各个组件及其关系.Spring使用BeanF ...
随机推荐
- Python--day63--单表的增删改查/GET和POST/request相关知识点回顾
- laydate type=time/datetime/date 开始时间和结束时间的输入限制
最近项目中使用了laydate插件,需要限制开始时间和结束时间的输入 1.type=date 要求:周期开始时间和周期结束时间以天为单位,结束时间不能早于开始时间,可以是同一天. 周期开始时间:< ...
- js基础-原型
1.定义:我们创建的函数都有一个prototype(原型)属性,该属性是一个对象, 原型模式声明中多了两个属性(自动生成). 构造函数: function Box(nam ...
- PHP mysqli扩展整理,包括面向过程和面向对象的比较\事务控制\批量执行\预处理
相关文章:PHP的mysql扩展整理,操作数据库的实现过程分析 PHP PDO扩展整理,包括环境配置\基本增删改查\事务\预处理 介绍 mysqli是PHP程序与mysql数据库进行数据交互的桥梁, ...
- tensorflow在文本处理中的使用——CBOW词嵌入模型
代码来源于:tensorflow机器学习实战指南(曾益强 译,2017年9月)——第七章:自然语言处理 代码地址:https://github.com/nfmcclure/tensorflow-coo ...
- H3C配置Trunk端口
- linux tasklet工作队列
工作队列是, 表面上看, 类似于 taskets; 它们允许内核代码来请求在将来某个时间调用 一个函数. 但是, 有几个显著的不同在这 2 个之间, 包括: tasklet 在软件中断上下文中运行的结 ...
- linux 安装一个中断处理
如果你想实际地"看到"产生的中断, 向硬件设备写不足够; 一个软件处理必须在系统中配 置. 如果 Linux 内核还没有被告知来期待你的中断, 它简单地确认并忽略它. 中断线是一个 ...
- redux.js的基本使用
1.先是安装reduxJx, cnpm i --save rudux 2.创建一个store的js文件 3.使用import来引用 redux import { createStore } from ...
- ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(开篇)
源码下载地址:http://www.yealuo.com/Sccnn/Detail?KeyValue=c891ffae-7441-4afb-9a75-c5fe000e3d1c 这是一个比较简单 ...