spring入门
Spring官网:https://spring.io,在spring的官网上有非常详细的文档。目前Spring框架最新版本为Spring5, Spring5要求的JDK最新的版本为JDK8。
一、什么是Spring
在狭义上,它可以用来指代Spring Framework项目本身,他是为了解决企业应用开发的复杂性而创建的。Spring框架使用基本的POJO来完成以前只可能由EJB完成的事情,从简单性,可测试性和松耦合的角度来看,java应用开发均可以从Spirng框架中获益。Spring框架的核心是控制反转和面向切面编程。简单来说,Spring框架是一个分层的,面向切面与java应用的一站式轻量级开源框架。
在广义上,随着时间的流逝,已经在Spring框架之上构建了其他Spring项目。通常,当人们说“Spring”时,它们表示整个项目系列(例如包括Spring boot,SpringSecurity, Spring mvc, Spring data,等等)。但是这里,我们要学习的只是Spring Framework这一个项目,以下文档的所有范围内的Spring均指代Spring Framework这一个项目。
Spring的优势:
为了降低Java开发的复杂性,Spring采取了以下4中策略:
-
基于pojo的轻量级和最小侵入性编程
-
通过依赖注入和面向接口实现松耦合
-
基于切面和惯例进行声明式编程
-
通过切面和模板减少样板式代码
几乎Spring做的任何事情都可以追朔到上述的一条或者多条策略。
对于轻量级一词的理解,轻量级所指的并不是类的数量的多少或者发布的大小,而是指使用这种框架,对我们原有程序的影响(或者说为了使用这种框架,我们需要对原有代码要做多少调整来适应框架的使用)。而我们说Spring是轻量级的,是因为只需要对应用程序做很少的改动,就能获得Spring Core给我们带来的巨大的好处。
二、spring的模块简介
spring是模块化的,允许我们开发人员自己自由选择需要使用的部分。
spring一共包含有21个不同的jar包,其中若干个包组成了一个大的模块系统
- Spring Core 核心容器模块
-
- spring-core包和spring-beans包提供框架的基础部分,包括IOC和DI功能,BeanFactory是一个复杂的工厂模式的实现,无需编程就能实现单例,并允许开发人员将配置和特定的依赖从实际程序逻辑中解耦
- Context包建立在core和beans模块的基础之上,context继承了Beans模块的特性,并且增加了对国际化的支持,事件广播,资源加载和创建上下文等等
-
- spirng-expression包提供了强大的表达式语言
- AOP模块
能够实现方法拦截器和切入点完全分离的代码。
-
事务
-
消息模块
-
数据访问
提供了数据访问,事务,对象关系映射等功能的集成
- web
即将要学习的Springmvc框架包含其中,两外还包括了spring5新增的支持响应式编程的Web开发框架
- 测试
组合Junit或TestNG来实现单元测试和集成测试等功能
github上Spring的源码的所有包截图
三、Spring的HelloWorld入门案例
先例行公事,写一个Spring的HelloWorld程序,工程的结构如下
分别创建三个文件,MessageService, MyApplication, Service.xml
首先在我们的pom.xml中引入我们的Spring-context模块,使用的5.1.10版本,依赖如下:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.10.RELEASE</version>
</dependency>
然后分别贴出三个文件,首先是MessageService.java文件
package com.Joshua.classn.service;
public class MessageService {
public void printMessage(){
System.out.println("HelloWrold!");
}
}
这个类超级简单,就是一个printMessage方法,方法的功能就是打印一个HelloWorld。
然后是service.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 id="messageService" class="com.Joshua.classn.service.MessageService"/>
</beans>
可以看到有一个bean标签,并且bean标签中有两个属性,一个是id,一个是class
- id是给我们的这个bean组件指定一个全局唯一的标识,通常会以类名,并且首字母小写作为该标识
- class指定该组件的类的类路径。
然后是我们的MyApplication类
package com.Joshua.classn;
import com.Joshua.classn.service.MessageService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyApplication {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("service.xml");
MessageService messageService = (MessageService)applicationContext.getBean("messageService");
messageService.printMessage();
}
}
在MyApplication中只写了一个main方法,在main方法中有两个关键的语句。
一个是new ClassPathXmlApplicationContext("service.xml");
还有一个就是getBean
方法
最终我们执行MyApplication类中的main方法
可以发现,getBean方法返回的就是我们的一个messageService实例,而这个实例时由容器applicationContext中获取的得到的,而并非自己通过构造方法实例化的,可以通过获取到的实例调用了printMessage方法打印了HelloWorld。