使用 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@EnableAutoConfigurationpublic 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)@WebAppConfigurationpublic 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、控制器类
@Controllerpublic 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 仓库即可):
评论