spring boot简介
spring项目在企业级的开发中的地位日趋重要。基本上在很大程度上替代了ejb框架,可插拔性、事物管理更是相当优秀。但是spring的配置比较繁琐。需要我们单独的配置事物,单独的配置web环境。配置在不同的环境下,可能会出错。spring-boot应运而生。spring-boot将以前spring项目的繁琐的配置简化了,基本上可以实现零配置。并且可以将tomcat嵌入到spring中,可以将项目打成一个可运行的jar,也可以打成一个war包。大大的简化了java开发者们工作,使我们可以侧重的关注业务。本片博客,旨在搭建框架,不会侧重的讲spring-boot的原理或者好处。
spring-boot是什么?
spring的目的是提供一组工具,来帮助我们快速的构建基于spring的应用程序。项目构建完成以后,可以通过运行普通的jar文件一样运行spring项目(spring内嵌web容器)。
spring-boot怎么使用
1. starter
starter是spring中的一个很重要的组成部分。没有使用spring-boot以前,假如我们使用maven构建项目,需要在pom文件中配置大量的依赖项有了starter之后,只需要引入对应的starter,依赖项都被引入了,下面是一些重要的starter:
spring-boot-starter-parent:定义了一些依赖项的版本,可以适当的进行扩展
spring-boot-starter-web:构建基于springmvc的RESTful Web项目,
spring-boot-starter-jdbc:构建连接池服务默认基于tomcat连接池实现,
spring-boot-starter-log4j:构建spring中的日志组件,默认基于log4j和slflog4j,
mybatis-spring-boot-starter:构建mybatis作为持久层的项目,注意和spring的版本相对应
其他的参展spring-boot的官方文档
2. 自动配置
spring-boot的项目官方推荐都需要有一个应用程序的入口类,在这个类中可以设置是否开启spring的默认配置。推荐的项目结构为:
•@EnableAutoConfiguration
在程序的入口类上添加,spring-boot根据classpath中的类路径中的jar依赖,为当前项目进行自动配置。比如jar包中有hsqldb.jar,项目中又没有配置任何数据源,则spring会为项目配置一个基于hsqldb的内存数据库。
•@ComponentScan
在程序的入口类上添加,这个类就不用赘述了,使用过spring的都知道项目会配置ioc容器的扫描路径。会自动注册扫描路径中的@Component, @Service, @Repository, @Controller注解。
•@Configuration
允许在上下文中注册额外的bean或导入其他配置类
•@SpringBootApplication
这是一个组合注解,加了这个注解之后,相当与入口类同时有了@EnableAutoConfiguration、@ComponentScan、@Configuration等注解的功能
3. 核心api
•Application.java
程序的入口类,通常要提供main方法,一个project通常只需要一个入口类。main方法中需要调用SpringApplication.run(),main方法中需要调用SpringApplication类启动spring运行环境的上下文。比如根据自动配置,初始化ioc和aop等信息。
•SpringApplication.java
SpringApplication可以作用在入口程序的main方法中,使用我们能够在main方法中初始化spring的上下文(IOC AOP)
•SpringBootServletInitializer.java
如果我们不需要将程序打成jar,而是打成war包的时候,这个类将会用到。通常是入口类需要继承这个抽象类。并且重写configure()方法。这个类的作用主要起到模拟web.xml的作用。使用到了这个类,我们就不需要在web.xml中配置初始化spring 的filter和servlet了。
搭建spring-boot运行的项目
项目搭建环境说明
项目中搭建的环境为:spring-boot-starter-parent:1.5.14.RELEASE
spring-boot-starter-log4j:1.3.8.RELEASE
mybatis-spring-boot-starter:1.3.0
druid(连接池):1.1.10
springloaded.(热部署):1.2.0.RELEASE
maven运行环境的配置
maven远程仓库可能会因为网络的问题,导致一下依赖下载失败,出现一些莫名的错误。我们会配置aliyun的maven镜像。
修改%MAVEN_HOME%/conf/settings.xml,修改:
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
pom文件的编写
1)项目版本配置
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.7</java.version>
<spring-boot-starter-log4j.version>1.3.8.RELEASE</spring-boot-starter-log4j.version>
<mybatis-spring-boot-starter.version>1.3.0</mybatis-spring-boot-starter.version>
<druid.version>1.1.10</druid.version>
<springloaded.version>1.2.0.RELEASE</springloaded.version>
</properties>
2)配置spring-boot-starter-parent
可以理解为spring-boot-starter-parent定义了一大堆的依赖版本,在下面dependency引用的时候,不需要再制定version了。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.14.RELEASE</version>
</parent>
3)配置spring-boot-starter
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
4)配置项目的日志为log4j
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>${spring-boot-starter-log4j.version}</version>
</dependency>
5)配置spring-boot-starter-tomcat
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
6)配置mybaits和数据源信息
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-spring-boot-starter.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
7)配置spring-boot打包插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>${springloaded.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
配置文件清单
application.properties配置
spring.datasource.type=com.isoftstone.spring_boot_helloworld.plat.datasource.DruidDataSource
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://192.168.233.134:3306/test?autoReconnect=true&useSSL=false
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.druid.maxActive=20
spring.mvc.static-path-pattern=/resources/**
spring.resources.static-locations=/resources/
注:spring-boot中静态资源的处理配置需要注意,
spring.mvc.static-path-pattern匹配的是静态资源访问的规则(css、js、image)
sspring.resources.static-locations是静态资源的路径,相对于项目的contextPath
spring-boot默认spring.mvc.static-path-pattern=/**,
spring.resources.static-locations是在classpath下。感兴趣的可以参考 [spring-boot官方文档](https://docs.spring.io/spring-boot/docs/1.5.14.RELEASE/reference/html/boot-features-developing-web-applications.html#boot-features-spring-mvc-static-content)
log4j配置
log4j.rootLogger=ERROR, Console, RollingFile
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d %-5p [%c{5}] - %m%n
#RollingFile
log4j.appender.RollingFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RollingFile.File=../logs/aligns.log
log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.RollingFile.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
#log4j.logger.java.sql=DEBUG
#Springframework level
#log4j.logger.org.springframework=ERROR
#Hibernate level
#log4j.logger.org.hibernate=ERROR
#log4j.logger.org.hibernate.cache.ehcache.AbstractEhcacheRegionFactory=ERROR
#log4j.logger.org.hibernate.search.impl.ConfigContext=ERROR
#log4j.logger.net.sf.ehcache.config.CacheConfiguration=ERROR
#Project defalult level
#log4j.logger.org.activiti.engine.impl.persistence=DEBUG
#log4j.logger.org.apache.shiro=DEBUG
log4j.logger.org.springframework=WARN
log4j.logger.org.springframework.scheduling.quartz=ERROR
#print SQL begin
log4j.logger.com.ibatis=DEBUG
log4j.logger.core.security.shiro.session.CacheSessionDAO=ERROR
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
#print SQL end
java代码清单
编写项目的入口类Application.java
package com.isoftstone.spring_boot_helloworld;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Configuration;
@SpringBootApplication
@MapperScan("com.isoftstone.spring_boot_helloworld.user.mapper")
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(
SpringApplicationBuilder application) {
return application.sources(Application.class);
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
自定义数据源DruidDataSource
package com.isoftstone.spring_boot_helloworld.plat.datasource;
import javax.sql.DataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
@ConfigurationProperties(prefix = "spring.datasource.druid")
public class DruidDataSource extends com.alibaba.druid.pool.DruidDataSource {
private static final long serialVersionUID = 1L;
@Bean
@Primary
public DataSource dataSource() {
return new DruidDataSource();
}
}
编写controller
package com.isoftstone.spring_boot_helloworld.app.user.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.isoftstone.spring_boot_helloworld.app.user.bean.User;
import com.isoftstone.spring_boot_helloworld.app.user.service.UserService;
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping
public List<User> index() {
return userService.findList(new User());
}
@RequestMapping("/user/add")
public String addUser() {
User user = new User();
user.setId(2);
user.setName("李四");
this.userService.addUser(user);
return "添加用户成功!";
}
}
service接口
package com.isoftstone.spring_boot_helloworld.app.user.service;
import java.util.List;
import com.isoftstone.spring_boot_helloworld.app.user.bean.User;
public interface UserService {
public void addUser(User user);
public List<User> findList(User user);
}
service实现类
package com.isoftstone.spring_boot_helloworld.app.user.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.isoftstone.spring_boot_helloworld.app.user.bean.User;
import com.isoftstone.spring_boot_helloworld.app.user.mapper.UserMapper;
import com.isoftstone.spring_boot_helloworld.app.user.service.UserService;
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
@Transactional
public void addUser(User user) {
userMapper.addUser(user);
}
@Override
public List<User> findList(User user) {
return userMapper.findList(user);
}
}
编写mapper
package com.isoftstone.spring_boot_helloworld.app.user.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import com.isoftstone.spring_boot_helloworld.app.user.bean.User;
@Mapper
public interface UserMapper {
@Insert("insert into sys_user(id,name) values(#{id},#{name})")
public void addUser(User user);
@Select("select * from sys_user ")
public List<User> findList(User user);
}
打包运行
直接可以将项目不到到tomcat中,跟部署普通的spring mvc war项目一样