Spring Boot笔记
2016-06-02 13:45
399 查看
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);
}
}
2、在src/main/resource目录下面,是放置一些配置文件,或模板支持的文件,如JSP,Velocity,Freemaker等,这里面比较常用或重要的一个文件,就是Spring
Boot的集中式配置文件application.properties这个文件了,这里面给其他大部分的组件,提供了一个可集中管理和配置的中心,包括安全控制,redis,solr,mangodb的连接信息,以及数据库连接池,容器端口号,jmx,java mail,动态模板等。此外这个目录下默认是可以访问静态资源的,比如我们的css,js,或者第三方的一些引用文件等。
关于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编码才可以正确记录对应的信息。一个通用的配置如下:
Xml代码
<!-- 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日志级别:
Java代码
#指定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
相关文章推荐
- 史上最全最强SpringMVC详细示例实战教程
- java dom4j解析XML读取数据源配置的代码实例
- JDK、J2EE、J2SE、J2ME的区别
- 如何学好java,给你教程
- RxJava源码浅析
- Implementing High Performance Parsers in Java
- 抽象类和接口的区别——从java的设计意图说起
- 深入理解Java的接口和抽象类
- 一致性hash算法与java实现
- Java常用排序算法之希尔排序
- BUG:eclipse中添加V7包ERROR: In <declare-styleable> MenuView, unable to find attribute android:pre
- Spring容器中Bean的作用域
- Java Concurrency - 浅析 CyclicBarrier 的用法
- 设置STS、ECLIPSE、myeclipse打开java源码乱码问题
- 用java做个日历,如果是这一天,就标上*号
- Eclipse 下 查询和复制类路径的快捷方法
- Java中如何遍历Map对象的4种方法
- java遍历文件夹里面的所有文件
- J2ee项目从0搭建(二):Maven下载、安装、eclipse+maven配置
- maven命令创建java和javaweb工程