随着项目的渐渐深入,springmvc 越来越满足不了当前我们项目所运用的模式了。虽然spring mvc 也是分成了controller、service、dao、util(common)等层级模块。但是如果想复用某一个比如说是底层common的话剥离开来就变得异常的麻烦, 因此模块分离也变得越来越有需要和必要了。
按包分块变得越来越流行,并且springboot 也变得越来越成熟和深得广大程序员的喜爱,大大减轻了项目开发和搭建的时间。在如今idea盛行的情况下,我就以springboot 作为接入口,0基础和大家探讨并且搭建springboot 多某块的系统构建。此次我先跳过在idea 上配置jdk 和maven的步骤,如果需要请在留言区提出来我再补发。
项目构建
打开idea,File->new Project.选择左边框中的Spring Initializer
选择next ,修改好Group 和 Artifacet
点击next 什么都不要选。最后点finish
创建结束后,删除src、mvn、等,只保留一个pom.xml文件,最终如下图:
开始创建子模块
选中project->new ->Module
填写ArtifactiId
next->修改一下Module name 中间加个斜杠(为了好区分)。点击finish 。
同理 添加dao,service,web层,此时 spring-bootdemo中的pom.xml文件中自动包含了这四个module。
设置启动项
到目前为止基本的模型已经出现,但是还是不能运行。接下去就要配置基本的入口了。
1.首先在demo-web中添加spring-boot 的依赖项
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- <version>RELEASE</version>
<scope>compile</scope>-->
</dependency>
</dependencies>
然后在 demo-web层创建一个com.bsoft.demo包,在demo下(和web同目录)创一个DemoApplication .java.代码如下所示:
package com.bsoft.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args){
SpringApplication.run(DemoApplication.class);
}
}
为什么这个不能写在web包下面呢?SpringBoot 在启动的时候默认会在启动类所在的包的路径进行扫描,然后将扫描的类自动注入。如果写在web下面,那么像其他module下面的就扫描不到了(因为只会扫描web包下面的class)。
我们在web目录下创建一个LoginController.java 用于接收前端传来的请求。看一下代码:
package com.bsoft.demo.web;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("login")
public class LoginController {
@GetMapping("/index")
public Map<String,Object> login(){
Map<String,Object> res_Map = new HashMap<String,Object>();
res_Map.put("key","1");
return res_Map;
}
}
解释一下:@RestController,官网上解释:
This code uses Spring 4’s new @RestController annotation, which marks the class as a controller where every method returns a domain object instead of a view. It’s shorthand for @Controller and @ResponseBody rolled together.
当然我们也可以直接进入RestController的代码中去看 很容易我们就知道,其实它就是@Controller+@ResponseBody的集合了。
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
import org.springframework.stereotype.Controller;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
@AliasFor(
annotation = Controller.class
)
String value() default "";
}
这下妈妈再也不用担心我们忘记写ResponseBody 返回的格式而导致前台解析报错了。最简单的springboot 搭建好了。我们来试下,在DemoApplication页面右键,run。等待springboot起来后,查看下面端口号 8080
在浏览器上输入地址,就可以返回啦。
接下来,配置各个模块的依赖关系。
- 父工程pom文件中都要声明所有的子模块的依赖。
- 子模块之间依赖关系:dao层依赖common层,service 依赖dao层,web依赖service层。
- 父工程pom文件中声明所有子模块依赖:
<?xml version="1.0" encoding="UTF-8"?> <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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <packaging>pom</packaging> <modules> <module>demo-common</module> <module>demo-dao</module> <module>demo-service</module> <module>demo-web</module> </modules> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.soft</groupId> <artifactId>spring-bootdemo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-bootdemo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <module.version>0.0.1-SNAPSHOT</module.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <!--下面新增--> <dependency> <groupId>com.soft</groupId> <artifactId>demo-common</artifactId> <version>${module.version}}</version> </dependency> <dependency> <groupId>com.soft</groupId> <artifactId>demo-dao</artifactId> <version>${module.version}}</version> </dependency> <dependency> <groupId>com.soft</groupId> <artifactId>demo-service</artifactId> <version>${module.version}}</version> </dependency> <dependency> <groupId>com.soft</groupId> <artifactId>demo-web</artifactId> <version>${module.version}}</version> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
demo-web 添加demo-service依赖
<dependency> <groupId>com.soft</groupId> <artifactId>demo-service</artifactId> </dependency>
demo-service 添加demo-dao依赖
<dependencies> <dependency> <groupId>com.soft</groupId> <artifactId>demo-dao</artifactId> </dependency> </dependencies>
demo-dao 添加demo-common依赖
<dependencies> <dependency> <groupId>com.soft</groupId> <artifactId>demo-common</artifactId> </dependency> </dependencies>
各个模块之间的调用
demo-common:
package com.bsoft.demo.utils;
import org.springframework.stereotype.Repository;
@Repository
public class StringUtils {
public String returnString(){
return "返回String";
}
}
demo-dao:
package com.bsoft.demo.dao;
import com.bsoft.demo.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
public class BaseDao {
@Autowired
StringUtils stringUtils;
public String getBaseDao(){
return "数据库已启动"+stringUtils.returnString();
}
}
demo-service :接口:
package com.bsoft.demo.service;
import javax.annotation.Resource;
public interface DemoService {
String returnSomthing();
}
接口实现:
package com.bsoft.demo.service.impl;
import com.bsoft.demo.dao.BaseDao;
import com.bsoft.demo.service.DemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class DemoServiceImpl implements DemoService {
@Autowired
BaseDao baseDao;
@Override
public String returnSomthing() {
return baseDao.getBaseDao();
}
}
demo-web LoginContorrol:
import com.bsoft.demo.service.DemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("login")
public class LoginController {
@Autowired
DemoService demoService;
@GetMapping("/index")
public Map<String,Object> login(){
String sonthing = demoService.returnSomthing();
Map<String,Object> res_Map = new HashMap<String,Object>();
res_Map.put("key",sonthing);
return res_Map;
}
}
最后我们的访问的效果是:
资源在下面的连接,有需要的可以自行下载。本来想免费给大家的,但是csdn一定要有分数才行