[推荐阅读时间:25min]
准备工作
本文是面向想了解如何开始使用Spring进行Java Web开发的同学。这里假设您已经了解了以下的相关技术:
- Java:程序开发语言,已安装好JDK1.8+以上的版本,并配置好环境变量
- Maven:包管理软件,已安装好3.2+以上的版本,并配置好环境变量
- Intellij IDEA:Java开发IDE
以上相关工具的安装和部署,如果需要的话,我可以再单独写文章介绍详细的操作步骤。
Spring 简介
Spring是目前广泛使用的Java Web开发框架。它将依赖注入(DI,Dependency Injection)和操作反转(IoC,Inversion of Control)的概念很好的实现,并通过模块化,支持各种丰富的功能,使得Web开发的复杂性大大的降低。
关于Spring的更多介绍,可以浏览Spring的主页进一步了解:
https://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/overview.html
开始
这里我们描述一个需求:可以通过URL的GET请求的方式,传入一个字符串,返回的是字符串的倒序结果,同时将每次的查询请求记录到MySQL数据库中。
hello -> olleh
1. 创建Maven项目
在Intellij IDEA中创建一个maven项目,不再展开描述,创建后的目录结构图如下所示:
引入Spring相关的Maven依赖,pom.xml文件:
2. 创建目录和类
Spring的目录结构,通常需要包括以下几部分:
- Config:Spring的相关配置类
- Entity:Spring Data相关的实体,Entity中的每个类对应数据库中的一张表
- Repository: 实体对应的Repository类
- Service:Spring的业务逻辑实现类,实现业务功能的主要代码
- Controller:Spring的接口层,实现对HTTP请求的处理
因此,针对之前提到的需求,构建的目录和类结构如下:
image.png
3. 创建基本配置
Spring最初是仅支持以xml的方式进行Bean,Service等相关组件的配置。但随着复杂性的增加,xml的配置方式使得代码越来越冗余,且不易维护。因此,Spring开始支持使用Java Config的方式进行配置,即通过Java代码进行配置,提高了配置的可读性和可维护性。我们介绍的均是使用Java Config进行配置的方式。
- GeneralConfig.java
package tk.meazza.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
/**
* 每个Java Config类,均需要使用该注解,相当于xml中的beans
*/
@Configuration
/**
* ComponentScan是每个Spring项目必须要配置的注解,它告诉Spring哪个packages包括用注解标识的类。
* 例如,如果你有个类用@Controller注解标识了,那么,如果不加上@ComponentScan,自动扫描该controller,
* 那么该Controller就不会被spring扫描到,更不会装入spring容器中,因此你配置的这个Controller也没有意义。
*/
@ComponentScan(basePackages = "tk.meazza")
/**
* PropertySource指定了属性文件,Spring可以加载此文件,并通过注入Environment环境变量的方式,
* 使用env.getProperty(key)获取数据。
*/
@PropertySource("classpath:config.properties")
public class GeneralConfig {
}
4. 单元测试
使用spring-test和Junit4框架,可以很容易的开始单元测试的工作,快速发现Spring配置或代码中的问题。这里由于还暂时没有任何业务代码,我们先写一个简单的测试类,用来检查Spring的基本配置是否正确。
package tk.meazza;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import tk.meazza.config.GeneralConfig;
/**
* 改变Junit的默认执行类,这里使用Spring的执行类,使得可以在单元测试类中使用Spring的特性。
*/
@RunWith(SpringJUnit4ClassRunner.class)
/**
* ContextConfiguration用来执行Spring配置的位置,可以使用xml,或者Java Config类。
*/
@ContextConfiguration(classes = {GeneralConfig.class})
public class InverterServiceTest {
@Test
public void test() {
System.out.println("Hello!");
}
}
运行test类,运行日志如下:
一月 29, 2018 11:09:46 上午 org.springframework.test.context.support.AbstractTestContextBootstrapper getDefaultTestExecutionListenerClassNames
信息: Loaded default TestExecutionListener class names from location [META-INF/spring.factories]: [org.springframework.test.context.web.ServletTestExecutionListener, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionalTestExecutionListener, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener]
一月 29, 2018 11:09:46 上午 org.springframework.test.context.support.AbstractTestContextBootstrapper instantiateListeners
信息: Could not instantiate TestExecutionListener [org.springframework.test.context.web.ServletTestExecutionListener]. Specify custom listener classes or make the default listener classes (and their required dependencies) available. Offending class: [javax/servlet/ServletContext]
一月 29, 2018 11:09:46 上午 org.springframework.test.context.support.AbstractTestContextBootstrapper instantiateListeners
信息: Could not instantiate TestExecutionListener [org.springframework.test.context.transaction.TransactionalTestExecutionListener]. Specify custom listener classes or make the default listener classes (and their required dependencies) available. Offending class: [org/springframework/transaction/interceptor/TransactionAttributeSource]
一月 29, 2018 11:09:46 上午 org.springframework.test.context.support.AbstractTestContextBootstrapper instantiateListeners
信息: Could not instantiate TestExecutionListener [org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener]. Specify custom listener classes or make the default listener classes (and their required dependencies) available. Offending class: [org/springframework/transaction/interceptor/TransactionAttribute]
一月 29, 2018 11:09:46 上午 org.springframework.test.context.support.AbstractTestContextBootstrapper getTestExecutionListeners
信息: Using TestExecutionListeners: [org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener@6537cf78, org.springframework.test.context.support.DependencyInjectionTestExecutionListener@67b6d4ae, org.springframework.test.context.support.DirtiesContextTestExecutionListener@34b7bfc0]
一月 29, 2018 11:09:46 上午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.GenericApplicationContext@55f3ddb1: startup date [Mon Jan 29 11:09:46 CST 2018]; root of context hierarchy
Hello!
一月 29, 2018 11:09:46 上午 org.springframework.context.support.AbstractApplicationContext doClose
信息: Closing org.springframework.context.support.GenericApplicationContext@55f3ddb1: startup date [Mon Jan 29 11:09:46 CST 2018]; root of context hierarchy
Process finished with exit code 0
这里代码测试类运行正常,Spring配置正常加载,可以进行下一步。
网友评论