其他分享
首页 > 其他分享> > 《精通Spring4.x企业应用开发实战》第三章

《精通Spring4.x企业应用开发实战》第三章

作者:互联网

  这一章节主要介绍SpringBoot的使用,也是学习的重点内容,之后就打算用SpringBoot来写后台,所以提前看一下还是很有必要的。

 

3.SpringBoot概况

3.1.1SpringBoot发展背景

  Spring Boot的出现。Spring Boot可让开发人员不再需要编写复杂的XML配置文件,仅通过几行代码就能实现一个可运行的Web应用。

  Spring Boot革新Spring项目开发体验之道,其实是借助强大的Groovy 动态语言实现的,如借助Groovy强大的 MetaObject协议、可插拔的AST转换器及内置的依赖解决方案引擎等。在其核心的编译模型中,Spring Boot使用Groovy来构建工程文件,所以它可以轻松地利用导入模板及方法模板对类所生成的字节码进行改造,从而让开发者仅很简洁的代码就可以完成很复杂的操作。

  从Spring Boot项目名称中的 Boot可以看出,Spring Boot的作用在于创建和启动新的基于Spring框架的项目,其目的是帮助开发人员快速构建出基于Spring 的应用。SpringBoot像一个“管家”,它会在后台“智能地”整合项目所需的第三方依赖类库或框架,因此大部分基于Spring Boot的应用仅需要很少的配置就可以运行起来。

  Spring Boot包含如下特性:    

    为开发者提供Spring 快速入门体验    

    内嵌Tomcat和 Jetty容器,不需要部署WAR文件到Web容器就可独立运行应用。    

    提供许多基于Maven的pom配置模板来简化工程配置。提供实现自动化配置的基础设施。    

    提供可以直接在生产环境中使用的功能,如性能指标。

    应用信息和应用健康检查开箱即用,没有代码生成,也无须XML配置文件,支持修改默认值来满足特定需求。

 

3.2快速配置。

  我们以Maven方式快速创建一个 Spring Web应用,首先需要在pom.xml文件中引入 Spring Boot依赖。引用了一个spring-boot-starter-web启动器依赖,不像在第2章中的示例一样,需要引入很多Spring子模块依赖。其他的模块都已经封装好了。

  @EnableAutoConfiguration注解是由Boot提供的,用于对Spring框架进行自动配置,减少了开发人员的工作量;@RestController和@RequestMapping注解是由SpringMVC提供的,用于创建Rest 服务。

  

  虽然Spring Boot没有强制要求工程代码结构按某种方式进行组织,但为了编写代码的可读性,建议采用所示的包组织方式。

  

 

  建议将应用的主类放在主包外层,将Application应用主类放在com.smart主包下。这个主类声明了main()方法,并在类级别上标注@Configuration、@ComponentScan,@EnableAutoConfiguration注解。在Spring Boot 1.2+中可以使用@SpringBootApplication注解代替上面3个注解。其他子包规划包括Web、Service、Domain、DAO等。一个典型的Application主类如代码所示。

  

  

  

3.4持久层

  Spring框架提供了几种可选的操作数据库方式,可以直接使用Spring 内置轻量级的JdbcTemplate,也可以使用第三方持久化框架Hibernate或 MyBaits。Spring Boot为这两种操作数据库方式分别提供了相应的启动器spring-boot-starter-jdbc和 spring-boot-starter-jpa。应用Spring Boot启动器使数据库持久化操作变得更加简单,因为Spring Boot会自动配置访问数据库相关设施。只需在工程模块 pom.xml文件中添加spring-boot-starter-data-jdbc或spring-boot-starter-data-jpa依赖即可。下面将采用Boot 提供的JDBC启动器来实现第⒉章登录示例的持久层。

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.3.RELEASE</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>chapter3</artifactId>
    <name>Spring4.x第三章实例</name>
    <packaging>war</packaging>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        ...

 

  导入依赖包之后,为了让Spring Boot能够自动装配数据源的连接,需要在资源根目录resources下创建一个application.properties,配置数据库的连接信息,如代码所示。

  

  

  在Spring Boot 中,可以通过两种方式配置数据库连接。一种是通过自定义连接的方式,如在配置文件①-1处,通过配置spring.datasource.*选项设定数据源的链接地址、连接驱动器、用户名及密码。在默认情况下,Boot启动器自动创建tomcat-jdbc连接池。如果不想采用默认的连接池,则可以通过 spring.datasource.type属性手工指定项目所需的连接池(如DBCP、C3PO)。

  另外一种是通过JNDI方式设置,在生产环境中通常会采用此种方式。如在示例②处,为spring.datasource.jndi-name属性指定一个JNDI连接名称即可。
  在 Boot中提供了灵活的数据库初始化方式,可以设定DDL脚本,也可以设定DML脚本。如示例③处,spring.datasource.initialize 属性设置启动的时候是否进行初始化;spring.datasource.platform 属性设置当前数据库类型(如Oracle、MySQL、SQL Server等); spring.datasource.data属性设置DML 脚本文件名称,在启动的时候会从类根路径加载data-S{platform}.sql文件执行,其中$ {platform}为当前数据库类型,本示例配置会加载data-mysql.sql; spring.datasource.schema属性设置DDL脚本文件名称,在启动的时候会从类根路径加载schema-mysql.sql文件执行。

  

3.4.2UserDao

  这里用@Repository定义了一个DAO Bean,用@Autowired将Spring容器中的 Bean注入进来。这个写法与第⒉章中的示例一致。细心的读者可能会有疑问:采用Boot方式与普通的方式不是一样的吗?
  大家可以回顾一下第2章的持久层,写完了业务操作DAO之后,还有一个重要的步骤,就是要在Spring容器中装配DAO。
  在Spring Boot中,这个步骤就不需要了,Boot 会自动帮我们装配好。这就是SpringBoot的强大之处,开发人员只需关注业务的实现,而无须关注Bean装配等配置,这也是Spring Boot设计的初衷。

  

 3.5业务层

  在编写业务层代码时有两个重要的步骤:一是编写正确的业务逻辑;二是对业务事务的管控。在 Spring Boot中,使用事务非常简单,首先在主类Application 上标注@EnableTransactionManagement注解(开启事务支持,相当于XML中的<tx:annotation-driven/>配置方式),然后在访问Service方法上标注@Transactional注解即可。如果将@Transactional注解标注在Service类级别上,那么当前Service类的所有方法都将被事务增强,建议不要在类级别上标注@Transactional注解。

  通过@EnableTransactionManagement注解,Boot为应用自动装配了事务支持。这对用户并不透明,用户如果想自己定义事务管理器,则在Application类中添加一个即可,如代码所示。

  

 

  在Application中添加自定义事务管理器方法txManager),并在方法上标注@Bean注解,此时Spring Boot 会加载自定义的事务管理器,不会重新实例化其他事务管理器。

  如果在实际的项目中需要分布式事务支持,那么,Boot也提供了很好的支持,它集成了Atomikos和 Bitronix分布式事务处理框架,可以根据需要导入相应的启动器( spring-boot-starter-jta-atomikos或spring-boot-starter-jta-bitronix)。

  

3.6展现层

3.6.1配置pom.xml依赖
  由于在示例中使用JSP作为视图,且用到了JSTL标签,因此需要再添加相关的依赖包,如代码所示。

        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>

 

3.6.2配置Spring MVC框架
  在 Boot环境中配置MVC很简单,只要将上面的应用启动类Application稍作修改即可,如代码所示。

  

  在①处继承了Spring Boot提供的Servlet初始化器SpringBootServletInitializer,在②处重写了SpringBootServletInitializer 的configure()方法。

  

3.6.3处理登录请求

  首先需要编写的是LoginController,它负责处理登录请求,完成登录业务,并根据登录成功与否转向欢迎页面或失败页面。这与第2章示例LoginController一致,如代码所示。

@RestController
public class LoginController{
    private UserService userService;
    
    @RequestMapping(value = {"/","/index.html"})
    public ModelAndView loginPage(){
        return new ModelAndView("login");
    }
    
    @RequestMapping(value = "/loginCheck.html")
    public ModelAndView loginCheck(HttpServletRequest request,LoginCommand loginCommand){
        boolean isValidUser =  userService.hasMatchUser(loginCommand.getUserName(),
                                        loginCommand.getPassword());
        if (!isValidUser) {
            return new ModelAndView("login", "error", "用户名或密码错误。");
        } else {
            User user = userService.findUserByUserName(loginCommand
                    .getUserName());
            user.setLastIp(request.getLocalAddr());
            user.setLastVisit(new Date());
            userService.loginSuccess(user);
            request.getSession().setAttribute("user", user);
            return new ModelAndView("main");
        }
    }

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
}

 

  编写好登录控制器LoginController 之后,接下来配置MVC视图映射。首先创建一个文件夹用于存放JSP文件。为了统一规范,在 src/main/webapp/WEB-INF目录下创建一个jsp文件夹,并将第﹖章示例中创建的两个页面(login.jsp 或main.jsp〉复制到此目录。

  

  在默认情况下,Spring Boot对/static、/public、/resources或/META-INF/ resources目录下的静态文件提供支持,所以我们可以将应用中的静态文件(JS、CSS、Image等)放到这几个目录中。
规划好视图目录后,最后一步就是在 application.properties 中配置创建好的视图的路径。

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

  通过spring.mvc.view.prefix 属性指定视图路径的前缀,通过 spring.mvc.view.suffix属性指定视图文件的后缀。至此,我们就完成了对第⒉章登录示例的改造工作。    

  最后,通过Spring Boot运行应用插件。双击spring-boot:run命令,即可启动应用。

   基于Spring Boot应用,由于当前应用包含了一个可直接运行的Application类,所以在开发过程中,大家很容易在IDE(如 IDEA 工具)中单击鼠标右键运行当前类。虽然可以启动当前应用,在非 Web应用中可能不会有什么问题,但在 Web 应用中,如果采用上述方法直接运行应用,那么在访问有视图的页面时(如JSP),会一直报404错误。

  因为直接运行当前启动类,Spring Boot无法找到当前页面资源。因此,基于SpringBoot 的应用在开发调试的时候,一定要基于Spring Boot提供的 spring-boot-maven-plugin插件命令来运行应用或通过Spring Boot命令行来运行应用。

  基于Spring Boot应用,添加监控功能非常简单,只需在应用的pom.xml文件中添加spring-boot-starter-actuator依赖即可。

 

 

  

 

  

 

 

  

  

  

  

 

标签:第三章,spring,boot,Boot,企业应用,starter,应用,Spring,Spring4
来源: https://www.cnblogs.com/hellostranger/p/13960899.html