写点什么

SpringBoot 之基础知识

作者:andy
  • 2022-10-27
    北京
  • 本文字数:4527 字

    阅读完需:约 15 分钟

使用 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 仓库即可):



用户头像

andy

关注

还未添加个人签名 2019-11-21 加入

还未添加个人简介

评论

发布
暂无评论
SpringBoot之基础知识_andy_InfoQ写作社区