使用 SpringBoot 官方提供的快速启动项目方式,不适合实际的企业项目开发,故需要重新定义编写项目。
一、统一父 POM 管理
1、创建父 POM
创建一个新的 Maven 项目,定义父 POM 结构,将 pom 文件 packaging 类型改为 pom,在 pom 文件定义全局属性、全局引用包、编译的相关插件(POM 高级应用思想),父 pom 的依赖包结构需要使用 dependencyManagement 进行管理。同时,需要注意,父 pom 只是定义包,其他的各种文件都可以全部删除掉了。
为了使用 springboot 框架,引用其依赖包 spring-boot-dependencies。但是,首次导入时,会提示没有版本。SpringBoot 相关包不用进行属性设置,项目会根据依赖包自动设置属性,仅使用导入类型进行设置即可。
同时,不要忘了添加编译插件。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.fuys</groupId>
<artifactId>ownsbp</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<!-- own spring boot parent -->
<name>ownsbp</name>
<url>http://maven.apache.org</url>
<properties>
<jdk.version>1.8</jdk.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<finalName>ownsb</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<configuration>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<modules>
<module>ownsbb</module>
</modules>
</project>
复制代码
2、创建子模块
创建 springboot 的子模块,pom 文件自动添加父 pom 文件路径。随后修改 pom 文件,追加 springboot 的 web 支持。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
复制代码
3、子模块编写程序
在子模块中编写控制层程序,直接使用 Java Application 或者 STS 插件运行即可。
package org.fuys.ownsbb;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@EnableAutoConfiguration
public class SampleController {
@RequestMapping("/")
@ResponseBody
String home() {
return "Hello World!";
}
public static void main(String[] args) throws Exception {
SpringApplication.run(SampleController.class, args);
}
}
复制代码
二、代码测试
实际开发需要进行项目测试。传统的 Spring 项目,可以直接使用 SpringTest 即可。当前项目基于 SpringBoot 技术,故在 pom 文件中添加 SpringBoot 测试支持组件。同时,对于 Java 程序的测试而言,最简单实用的测试组件就是 JUnit。综合考虑,junit 与 spring-boot-starter-test 一起使用。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
复制代码
部分测试代码如下:
@SpringBootTest(classes=SampleController.class)
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class SampleControllerTest {
@Resource
private SampleController sampleController;
@Test
public void testHome(){
TestCase.assertEquals(sampleController.home(), "Hello Spring Boot");
}
}
复制代码
三、启动注解分析
要实现 SpringBoot“零配置”的目标,那么,就需要使用注解。在 SpringBoot 中,使用了许多的注解,以下列表说明常见的几项。
@EnableAutoConfiguration 为整个 SpringBoot 的启动注解配置,故这个注解应该在主类中进行定义。而控制器程序会非常多,故将所有控制器类统一在主类所在包的子包下。例如控制器所在包 org.fuys.ownsbb.controller 必须在 org.fuys.ownsbb 主类所在包下。
强调(Spring 官方建议):为了简化开发,所有程序类一定要在启动类所在包的子包下。
1、启动程序主类
@EnableAutoConfiguration
@ComponentScan("org.fuys.ownsbb")
public class SpringBootApp {
public static void main(String[] args) throws Exception {
SpringApplication.run(SpringBootApp.class, args);
}
}
复制代码
2、控制器类
@Controller
public class SampleController {
@RequestMapping("/")
@ResponseBody
public String home() {
return "Hello Spring Boot";
}
}
复制代码
以上扫描包的方式属于传统 MVC 方式,同时,控制器所在的包和主类所在包属于不同的包,因此,为了简化开发,故要求控制器所在包一定要在主类所在包的子包上,使用以下注解实现简化开发,@SpringBootApplication。再次强调,一定要在所有类所在包一定为主类包的子包。
“@SpringBootApplication = @EnableAutoConfiguration + @ComponentScan + 其他配置”。正是基于此,使用 Bean 实现配置处理会非常容易。
四、路径访问控制
控制器响应有两种运行模式:跳转配置、Restful 显示。具体选择何种方式进行返回,以实际项目需求而定。
1、以控制器注解为例
@Controller 表示注解定义一个控制器;
@ResponseBody 表示请求方法的响应返回值为 rest 内容,如果方法不加该注解修饰,则跳转至页面。
如果控制器中定义的所有方法返回都是 rest 内容,可以使用符合注解“@RestController”简化代码。
从实际开发来看,控制器需要传递一些属性到页面进行显示,按照这样的原则并不是所有的开发都会以 Restful 结构返回,但是 Rest 结构是 SpringCloud 的实现核心技术。
2、控制器的请求方法也可以接受参数进行处理,传递参数到控制器之中最简单的做法是使用地址重写传递“xx?参数名称=参数值”
访问路径:http://localhost:8080/echo?msg=hello
@RestController
public class SampleController {
@RequestMapping("/echo")
public String echo(String msg){
return "echo:" + msg;
}
}
3、SpringBoot 支持 Rest 风格处理,对于参数的接收可以采用路径参数的形式完成。
请求路径:http://localhost:8080/print/hello
@RestController
public class SampleController {
@RequestMapping(value="/print/{message}",method=RequestMethod.GET)
public String print(@PathVariable("message")String msg){
return "msg:" + msg;
}
}
4、对于 web 项目而言,每次修改程序,需要重新启动容器,非常麻烦。故 SpringBoot 项目追加自动加载配置的依赖库。在父模块上追加依赖。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.8.RELEASE</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
复制代码
五、使用内置對象
SpringBoot 的控制器與 SpringMVC 相同,可以直接獲取得到 JSP 頁面的内置對象。内置對象獲得,就可以很好的進行各種請求相应处理操作。
代碼示例如下:
@RequestMapping("/obtain")
public String obtain(HttpServletRequest request,HttpServletResponse response){
System.out.println("客户端地址:" + request.getRemoteAddr());
System.out.println("客户端响应编码:" + response.getCharacterEncoding());
System.out.println("SessionID:" + request.getSession().getId());
System.out.println("真实目录地址:" + request.getServletContext().getRealPath("/"));
return "www.ysfu.club";
}
复制代码
程序打印日志:
客户端地址:0:0:0:0:0:0:0:1
客户端响应编码:ISO-8859-1
SessionID:59BF8C0DAF56DCCB24F627A4F197897B
真实目录地址:C:\Users\ys\AppData\Local\Temp\tomcat-docbase.2690943980054270843.8080\
SpringBoot 依然需要有工作目录,该工作目录由 SpringBoot 自己定义,主要是在当前用户的目录下存在。
六、项目打包发布
SpringBoot 作为微架构的主要技术,发布项目的方式极为简单,只需要配置好插件,然后打包就行。
1、修改父项目 pom 文件,追加 spring-boot-maven-plugin 插件,该插件用于项目的打包发布处理,然后进行项目的整体更新。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>org.fuys.ownsbb.SpringBootApp</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
复制代码
2、将当前项目进行打包处理:clean package
在项目工作区的 target 目录下会生成一个之前定义好的打包项目 jar 包,如 ownsb.jar。该 jar 包含所有依赖的包。
3、只需要将该 jar 包放置到指定目录下,然后就可以通过命令直接运行打包程序,不需要再进行容器部署。当然前提是需要有 jdk 环境。这就是微架构的极大好处,因为有了 springboot,也使得 springcloud 更加使用方便,通常两者相互结合使用。
指令如下:
java -jar ownsb.jar
补充:
为了便于使用 git 进行项目管理,由于一开始创建项目时是在 eclipse 的默认工作空间,父项目和子模块是文件包含关系,并不是分隔开的,所以使用 git 共享项目时,会将父项目和子模块分隔开,从而造成子模块无法正确找到父项目。故建议一开始就选择一个新的工作空间作为源代码存储目录,然后就直接使用该目录作为 git 仓库即可。
原有更改方式:
直接使用新的工作空间作为 git 仓库(这里需要注意,因为子模块就在父项目目录下,故将父项目定义为 git 仓库即可):
评论