1.入门概念
1.Spring Boot 并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具。同时它集成了大量常用的第三方库配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),Spring Boot应用中这些第三方库几乎可以零配置的开箱即用(out-of-the-box),大部分的Spring Boot应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑。
Spring Boot项目结构
com
+- example
+- myproject
+- Application.java
|
+- domain
| +- Customer.java
| +- CustomerRepository.java
|
+- service
| +- CustomerService.java
|
+- web
+- CustomerController.java
需要注意的地方如下:
1,在src/main/java包下的第一层结构中,是必须放一个含有main方法的主启动的类,而且只能有一个main方法,如果再出现其他的main方法,在使用maven编译打包时,会报编译错误,当然在src/test/java包下,可以出现多个,但建议最好使用Junit进行单元测试.
这个main方法启动,就会启动内嵌的tomcat或jetty容器,然后加载所有需要加载的或扫描的类或资源文件。上篇博客中,散仙为了测试方便,是直接在当前的Conroller中,启动了一个测试服务,这样做适合单独调试,如果是生产环境下的启动方法,则是散仙前面所讲的,在java包的根目录下建立一个main方法类,负责启动所有的资源
Spring Boot main()方法代码:
@Configuration//配置控制
@EnableAutoConfiguration//启用自动配置
@ComponentScan//组件扫描
public class ApplicationMain {
public static void main(String[] args) throws Exception {
//启动Spring Boot项目的唯一入口
SpringApplication.run(ApplicationMain.class, args);
}
}
关于Spring Boot常用的注解: 大部分来自Spring MVC的注解
(1)@RestController和@Controller指定一个类,作为控制器的注解
(2)@RequestMapping方法级别的映射注解,这一个用过Spring MVC的小伙伴相信都很熟悉
(3)@EnableAutoConfiguration和@SpringBootApplication是类级别的注解,根据maven依赖的jar来自动猜测完成正确的spring的对应配置,只要引入了spring-boot-starter-web的依赖,默认会自动配置Spring MVC和tomcat容器
(4)@Configuration类级别的注解,一般这个注解,我们用来标识main方法所在的类,完成元数据bean的初始化。
(5)@ComponentScan类级别的注解,自动扫描加载所有的Spring组件包括Bean注入,一般用在main方法所在的类上
(6)@ImportResource类级别注解,当我们必须使用一个xml的配置时,使用@ImportResource和@Configuration来标识这个文件资源的类。
(7)@Autowired注解,一般结合@ComponentScan注解,来自动注入一个Service或Dao级别的Bean
(8)@Component类级别注解,用来标识一个组件,比如我自定了一个filter,则需要此注解标识之后,Spring Boot才会正确识别。
特别注意:
@SpringBootApplication:当这个注解用于spring boot 项目的main类时,等价于 @Configuration,@EnableAutoConfiguration和@ComponentScan三个注解同时使用。
@EnableAutoConfiguration:根据项目中的classpath中的jar,自动生成需要的bean,加载到spring中。如果发现自动生成的bean不是想要的,可以通过exclude 属性配置排除。例如:@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
eg: WebAppConfig.java
@EnableScheduling
@EnableAutoConfiguration
@ComponentScan("com.lance")
@EntityScan("com.lance.entity")
@EnableJpaRepositories("com.lance.repository")
public class WebAppConfig extends WebMvcConfigurerAdapter{
@Autowired
private Crawler crawler;
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(WebAppConfig.class);
}
public static void main(String[] args) {
SpringApplication.run(WebAppConfig.class, args);
}
/**
* 配置拦截器
* @author lance
* @param registry
*/
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new UserSecurityInterceptor()).addPathPatterns("/user/**");
}
/**
* spring boot 定时任务
*/
@Scheduled(cron="0 0 22 * * ?")
public void reportCurrentTime() {
crawler.getBlogList(1);
}
}
日志的重要性,不言而喻,Spring Boot支持大部分的log配置,其中包括:
(1)java util logging
(2)log4j
(3)log4j2
(4)logbak
默认的情况下spring boot会选择logback作为日志记录的载体,当然要想它正常的工作,需要依赖 Commons Logging, Java Util Logging, Log4J 或 SLF4J,相信大部分同学都是选择使用log4j.properties作为我们的日志配置和管理,但是散仙在Spring Boot中一直没有测试集成成功,所以就放弃使用log4j.properties作为日志载体,而是选择了Spring Boot推荐的logbak作为日志的配置文件,用过之后感觉也不错。
使用步骤:
1,将logbak.xml拷贝至resource目录下的根目录,然后在logbak.xml中,配置相关的log生成规则,log级别,以及日志路径,log的字符编码集,这个非常重要,因为刚开始用这个log记录程序运行的信息时,发现它不支持中文log,后来经查名,需要配置相关的log编码才可以正确记录对应的信息。一个通用的配置如下:
- <!-- Logback configuration. See http://logback.qos.ch/manual/index.html -->
- <configuration scan="true" scanPeriod="10 seconds">
- <!-- Simple file output -->
- <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <!-- encoder defaults to ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
- <encoder>
- <pattern>
- [ %-5level] [%date{yyyy-MM-dd HH:mm:ss}] %logger{96} [%line] - %msg%n
- </pattern>
- <charset>UTF-8</charset> <!-- 此处设置字符集 -->
- </encoder>
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <!-- rollover daily 配置日志所生成的目录以及生成文件名的规则 -->
- <fileNamePattern>logs/mylog-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy
- class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <!-- or whenever the file size reaches 64 MB -->
- <maxFileSize>64 MB</maxFileSize>
- </timeBasedFileNamingAndTriggeringPolicy>
- </rollingPolicy>
- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
- <level>DEBUG</level>
- </filter>
- <!-- Safely log to the same file from multiple JVMs. Degrades performance! -->
- <prudent>true</prudent>
- </appender>
- <!-- Console output -->
- <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
- <!-- encoder defaults to ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
- <encoder>
- <pattern>
- [ %-5level] [%date{yyyy-MM-dd HH:mm:ss}] %logger{96} [%line] - %msg%n
- </pattern>
- <charset>GBK</charset> <!-- 此处设置字符集 -->
- </encoder>
- <!-- Only log level WARN and above -->
- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
- <level>WARN</level>
- </filter>
- </appender>
- <!-- Enable FILE and STDOUT appenders for all log messages.
- By default, only log at level INFO and above. -->
- <root level="INFO">
- <appender-ref ref="FILE" />
- <appender-ref ref="STDOUT" />
- </root>
- <!-- For loggers in the these namespaces, log at all levels. -->
- <logger name="pedestal" level="ALL" />
- <logger name="hammock-cafe" level="ALL" />
- <logger name="user" level="ALL" />
- </configuration>
2,在application.properties中,指定log文件的加载路径,已经配置通用的log日志级别:
- #指定log的配置文件,以及记录Spring Boot的log级别
- logging.config=logback.xml
- logging.level.org.springframework.web: INFO
2.@RestController
查看源码可知其包含了 @Controller 和 @ResponseBody 注解。我们可以理解为 @Controller的增强版。
专门为响应内容式的 Controller 而设计的,可以直接响应对象为JSON。 而 @Controller 用来响应页面,
spring-boot 支持多种模版引擎包括:
1,FreeMarker
2,Groovy
3,Thymeleaf (Spring 官网使用这个)
4,Velocity
5,JSP (貌似Spring Boot官方不推荐)
3.Servlet、Filter和Listener在Spring Boot中的使用
当使用spring-Boot时,嵌入式Servlet容器通过扫描注解的方式注册Servlet、Filter和Servlet规范的所有监听器(如HttpSessionListener监听器)。
Spring boot 的主 Servlet 为 DispatcherServlet,其默认的url-pattern为“/”
Web开发使用 Controller 基本上可以完成大部分需求,但是我们还可能会用到 Servlet、Filter、Listener、Interceptor 等等
1.添加Servlet 两种方法 --- Filter和Listener也是如此
1.代码注册Servlet
代码注册通过ServletRegistrationBean、 FilterRegistrationBean 和 ServletListenerRegistrationBean 获得控制。
也可以通过实现 ServletContextInitializer 接口直接注册
2.注解自动注册
在 SpringBootApplication 上使用@ServletComponentScan 注解后,Servlet、Filter、Listener
可以直接通过 @WebServlet、@WebFilter、@WebListener 注解自动注册,无需其他代码
4.Spring Boot中使用Spring提供的拦截器
实现自定义拦截器只需要3步:
1、创建我们自己的拦截器类并实现 HandlerInterceptor 接口。
2、创建一个Java类继承WebMvcConfigurerAdapter,并重写 addInterceptors 方法。
2、实例化我们自定义的拦截器,然后将对像手动添加到拦截器链中(在addInterceptors方法中添加)。
5.CommandLineRunner 接口 --- 在项目服务启动时,去加载一些数据或进行初始化操作
Spring Boot程序启动后,会遍历CommandLineRunner接口的实例,并运行它们的run()方法,
@Order注解,可以指定所有CommandLineRunner实例的运行顺序,@Order 注解的执行优先级是按value值从小到大顺序
eg:
@Component
@Order(value=2)
public class MyStartupRunner1 implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println(">>>>>>>>>>>>>>>服务启动执行,执行加载数据等操作 11111111 <<<<<<<<<<<<<");
}
}
@Component
@Order(value=1)
public class MyStartupRunner2 implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println(">>>>>>>>>>>>>>>服务启动执行,执行加载数据等操作 22222222 <<<<<<<<<<<<<");
}
}
启动程序后,控制台输出结果为:
>>>>>>>>>>>>>>>服务启动执行,执行加载数据等操作 22222222 <<<<<<<<<<<<<
>>>>>>>>>>>>>>>服务启动执行,执行加载数据等操作 11111111 <<<<<<<<<<<<<
6.Spring Boot中的日志记录 --- slf4j的logback输出日志,效率更高
7.Spring Boot 连接JDBC
1.maven依赖
<!-- MYSQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Spring Boot JDBC -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
2.JDBC配置,属性配置文件(application.properties)
spring.datasource.url=jdbc:mysql://localhost:3306/jay_db1
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
未完,待续、、、、、、
参考:http://blog.csdn.net/z69183787/article/details/46520581