Spring boot入门实例 简易登录(精通Spring+4.x++企业应用开发实战 学习笔记二)
2017-09-03 15:38
1031 查看
本例中的pom.xml为
<?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"> <!-- 继承Spring Boot默认配置--> <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> <!-- 导入spring-boot-starter-jdbc依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!--添加 spring-boot-starter-actuator依赖,可添加监控功能--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- 导入访问数据库的JDBC驱动器--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!-- 添加tomcat-embed-jasper依赖--> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency> <!--添加jstl模块依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <!--配置运行插件 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <useSystemClassLoader>false</useSystemClassLoader> </configuration> </plugin> </plugins> </build> </project>
快速入门
在pom.xml文件中引入Spring Boot依赖<?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</ 134d1 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> <!-- 添加一个Boot Web启动器 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>1.5.6.RELEASE</version> </dependency> </dependencies> </project>
在dependency中引用了一个spring-boot-starter-web启动器依赖
创建一个Web应用
package com.smart.web; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @EnableAutoConfiguration //由Boot提供的,用于对Spring框架进行自动配置,减少了工作量 public class BbsDaemon { @RequestMapping("/") public String index(){ return "欢迎光临论坛"; } public static void main(String[] args) throws Exception{ SpringApplication.run(BbsDaemon.class,args); } }
@EnableAutoConfiguration注解是由Boot提供的,用于对Spring框架进行自动配置,减少了工作量
@RestController和 @RequestMapping注解是由Spring MVC提供的,用于创建Rest服务。
直接运行BbsDaemon会启动一个运行与8080端口(默认)的内嵌Tomcat服务,访问”http://localhost:8080/“,即可看到
既没有配置安装Tomcat或Jetty这样的应用服务器,也没有打包成WAR文件,Spring Boot简直太方便了。
为了编写代码的可读性,建议采用下图的包组织方式
Application应用主类应该放在com.smart主包下
package com.smart; import org.springframework.boot.SpringApplication; //@Configuration //@ComponentScan //@EnableAutoConfiguration @SpringBootApplication public class Application { public static void main(String[] args) throws Exception { SpringApplication.run(Application.class, args); } }
这个主类声明了main()方法,并再类级别上标准了SpringBootApplication注解(代替了那三个注释的注解)
Spring Boot启动只需在main()方法中通过SpringApplication.run()方法启动即可。
安装配置
建议使用Maven或Gradle构建系统来使用Spring Boot基于Maven环境配置
为了更容易地管理依赖版本和使用默认配置,Spring Boot提供了一个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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <!-- ①继承Spring Boot默认配置--> <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-jetty</artifactId> </dependency> </dependencies> <build> <plugins> <!--③配置运行插件 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
在①出继承了Spring Boot提供的根默认配置依赖,并且指定当前版本号为1.3.3.RELEASE
这里引入spring-boot-starter-parent的好处是在②处添加启动器时不必再声明版本号
如果不想采用继承方式,也可以使用如下方式导入Boot提供的根配置
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>1.3.3.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
在③处引用了一个Spring Boot运行插件,可以在右边额Maven Projects中看到Spring Boot运行命令。
在默认情况下,Spring Boot会采用内嵌的Tomcat运行当前应用,如果想使用Jetty运行当前应用,只需在依赖中添加一个Jetty启动器(spring-boot-starter-jetty)
持久层
Spring框架提供了几种可选的操作数据库方式,可以直接使用Spring内置轻量级的JdbcTemplate,也可以使用第三方持久化框架Hibernate或MyBaits。Spring Boot为这两种操作数据库方式分别提供了相应的启动器spring-boot-starter-jdbc和spring-boot-starter-jpa。
要使用Spring Boot提供的JDBC启动器,首先在模块pom.xml中导入spring-boot-starter-jdbc依赖及访问数据库的JDBC驱动器
... <!-- 导入spring-boot-starter-jdbc依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!--导入访问数据库的JDBC驱动器 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> ...
导入依赖包之后,为了让Spring Boot能自动装配数据源的连接,需要在根目录resources下创建一个application.properties,配置数据库的连接信息
# Available levels are: TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF logging.level.com.smart = DEBUG logging.level.org.springframework.web = DEBUG #logging.file = /var/netgloo_blog/logs/spring-boot-logging.log spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp #server.contextPath=/ #server.port=8080 # ①-2 指定自定义连接池 #spring.datasource.type=org.apache.commons.dbcp2.BasicDataSource #①-1 配置数据库连接信息 spring.datasource.name=sampleDs spring.datasource.url=jdbc:mysql://localhost:3306/sampledb spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver # ②配置JNDI数据源 #spring.datasource.jndi-name=java:comp/env/jdbc/sampleDs #①-3 连接池配置信息 spring.datasource.max-wait=10000 spring.datasource.max-active=50 spring.datasource.max-idle=10 spring.datasource.min-idle=8 spring.datasource.test-on-borrow=true spring.datasource.validation-query=select 1 #③ 初始化数据库脚本 #spring.datasource.initialize=true #spring.datasource.platform=mysql #spring.datasource.data=data #spring.datasource.schema=schema
在Spring Boot中,可以通过两种方式配置数据库连接:
①通过自定义连接的方式,如①-1,通过配置spring.datasource.*选项设定数据源的链接地址,连接驱动器,用户名以及密码。默认情况下,Boot启动器自动创建tomcat-jdbc连接池。如果不使用默认的连接池,可以通过spring.datasource.type属性手工指定项目所需的连接池(如DBCP,C3P0).
②通过JNDI(Java Naming and Directory Interface,Java命名和目录接口)方式设置,在生产环境中通常采用这种方式。如在②为spring.datasource.jndi-name属性指定一个JNDI连接名称即可。
在Boot中提供了灵活的数据库初始化方式,可以设定DDL(Data Definition Language 数据定义语言)脚本,也可以设定DML(data manipulation language,数据操纵语言)脚本。
如③处,spring.datasource.initialize属性设置启动的时候是否进行初始化;spring.datasource.platform设置当前数据库类型;spring.datasource.data=data设置DML脚本文件名称,在启动的时候会从类根路径加载data-${platform}.sql文件执行,其中${platform}为当前数据库类型,本示例配置会加载data-mysql.sql;spring.datasource.schema设置DDL脚本文件的名称,在启动的时候会从类根路径加载schema-mysql.sql文件执行。
UserDao和LoginLogDao
与第二章中的UserDao和LoginLogDao一样,domain中的User和LoginLog也是第二章
看起来和没使用Spring Boot一样,但是Spring Boot会自动在Spring容器中装配DAO,而没用Spring Boot时候我们需要手动建立一个.xml的Spring配置文件来装配DAO
业务层
UserService负责将持久层的UserDao和LoginDao组织起来,完成用户/密码认证,登录日志记录等操作与第二章一样
在编写业务层代码时有两个重要的步骤:一是编写正确的业务逻辑;二是对业务事务的管控。
在Spring Boot中,使用任务非常简单,首先在主类Application上标@EnableTransactionManagement注解(开启事务支持,相当于XML中的<tx:annotation-driven/>配置方法),然后在访问Service方法上标注@Transactional注解即可(在UserService的loginSuccess()方法上)。
如果将@Transactional注解标注在Service类级别上,那么当前Service类的所有方法都将被事务增强,建议不要在类级别上标注@Transactional。
package com.smart; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.context.web.SpringBootServletInitializer; import org.springframework.context.annotation.Bean; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.web.WebApplicationInitializer; import javax.sql.DataSource; @SpringBootApplication @EnableTransactionManagement //启用注解事务管理 public class Application extends SpringBootServletInitializer implements WebApplicationInitializer { @Bean public PlatformTransactionManager txManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); } public static void main(String[] args) throws Exception { SpringApplication.run(Application.class, args); } }
通过@EnableTransactionManagement注解,Boot为应用自动装配了事务支持。这对用户并不透明,如果用户想自己定义事务管理器,则在Application类添加一个PlatformTransactionManager即可,如上的自定义事务管理器方法txManager(),并在方法上标注@Bean注解,此时Spring Boot会加载自定义的事务管理器,不会重新实例化其他事务管理器。
如果在实际的项目中需要分布式事务支持,Boot也提供了很好的支持,它继承了Atomikos和Bitronix分布式事务处理框架,可以根据需要导入相应的启动器(spring-boot-starter-jta-atomikos或spring-boot-starter-jta-bitronix)
展现层
在示例中使用JSP作为视图,且用到了JSTL标签,因此需要在添加相关的依赖包配置pom.xml依赖
<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>
为了支持JSP和JSTL,我们添加了tomcat-embed-jasper和jstl两个模板依赖,并将模板的打包方式改为WAR
配置Spring MVC框架
在Boot中配置MVC很简单,只要将启动类Application继承Spring Boot提供的Servlet初始化器SpringBootServletInitializer和重写SpringBootServletInitializer提供的configure()方法处理登录请求
编写LoginController,它负责处理登录请求,完成登录业务,并根据登录成功与否转向欢迎页面或失败页面,这与第二章一致在@RequestMapping注解中,可以配置多个映射路径,如
@RequestMapping(value={“/”,”/index.html”})
接下来配置MVC视图映射,首先创建一个文件夹存放JSP,统一规范在src/main/webapp/WEN-INF目录下创建一个jsp文件夹,并将第二章的两个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 Boot运行应用插件,双击spring-boot:run命令:
在浏览器中输入”http://localhost:8080/index.html“,可以跳到登录页面
也可输入,但
@RequestMapping(value={"/","/index.html"}) //可以配置多个映射路径 public String loginPage(){ return "login"; }
中记得配置多个映射路径
在基于Spring Boot的应用在开发调试的时候,一定要基于Spring Boot提供的spring-boot-maven-plugin插件命令来运行应用或通过Spring Boot命令行来运行应用,而不要右键鼠标运行当前类,在访问有视图的JSP的页面时(如JSP),会一直报404错误
运维支持
当应用部署到生产环境时,需要各种运维相关的功能的支持,如监控应用的各种性能指标,运行信息和应用状态等。Spring Boot对这些运维监控相关的类库进行了整合,形成了一个功能完备和可定制的启动器,称为Actuator
基于Spring Boot应用,添加监控功能只需在应用的pom.xml文件中添加
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
Spring Boot默认提供了对应用本身,关系数据库连接,MongoDB,Redis,Solr,ElasticSearch,JMS和Rabbit MQ等服务的健康状态的检查功能。
这些服务都可以在application.properties的management.health.*选项中进行配置
#数据库监控配置 management.health.db.enabled=true management.health.defaults.enabled=true #应用磁盘空间检查配置 #management.health.diskspace.enabled=true #management.health.diskspace.path=F:\programmer software #management.health.diskspace.threshold=0 #ElasticSearch服务健康检查配置 management.health.elasticsearch.enabled=true management.health.elasticsearch.indices=index1,index2 management.health.elasticsearch.response-timeout=100 #Solr服务健康检查配置 management.health.solr.enabled=true #JMS服务健康检查配置 management.health.jms.enabled=true #Mail服务健康检查配置 management.health.mail.enabled=true #MongDB服务健康检查配置 management.health.mongo.enabled=true #Rabbit MQ服务健康检查配置 management.health.rabbit.enabled=true #Redis服务健康检查配置 management.health.redis.enabled=true management.health.status.order=DOWN,OUT_OF_SERVICE,UNKNOWN,UP
下面Spring Boot默认提供的健康检查关键服务
相关文章推荐
- Spring 入门实例 简易登录系统(精通Spring+4.x++企业应用开发实战 学习笔记一)
- 精通Spring 4.x企业应用开发实战——笔记(二)
- 《精通Spring 4.x 企业应用开发实战》学习笔记
- 论坛开发实例 (精通Spring+4.x++企业应用开发实战)
- Spring基础(精通Spring+4.x++企业应用开发实战 第7章)
- Spring容器高级主题(精通Spring+4.x++企业应用开发实战 五)
- Spring的事务管理难点剖析(精通Spring+4.x++企业应用开发实战 第12章)
- Spring对DAO的支持(精通Spring+4.x++企业应用开发实战 第十章)
- 精通Spring 4.x企业应用开发实战——笔记(一)
- 《Spring 3.x 企业应用开发实战》学习笔记 第三章 ApplicationContext和BeanFactory区别
- Spring SpEL(精通Spring+4.x++企业应用开发实战 第九章)
- 《Spring 3.x 企业应用开发实战》学习笔记 第三章 IoC容器概述 3.2 相关Java基础知识 类装载器 反射机制
- 《Spring 3.x 企业应用开发实战》学习笔记 第四章
- 在IoC容器中装配Bean(精通Spring+4.x++企业应用开发实战 四)
- Ioc容器 (精通Spring+4.x++企业应用开发实战 三)
- 《Spring 3.x 企业应用开发实战》学习笔记 第三章 ApplicationContext和BeanFactory区别
- 精通Spring 4.x企业应用开发实战——IoC(三)
- 精通Spring 4.x企业应用开发实战——高级主题(六)
- 学习Spring3.X 企业应用开发实战笔记(二 )
- 精通Spring 4.x企业应用开发实战——AOP(七②)