Spring Boot笔记

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代码   收藏代码
  1. <!-- Logback configuration. See http://logback.qos.ch/manual/index.html -->  
  2. <configuration scan="true" scanPeriod="10 seconds">  
  3.     
  4.   <!-- Simple file output -->  
  5.   <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">  
  6.     <!-- encoder defaults to ch.qos.logback.classic.encoder.PatternLayoutEncoder -->  
  7.     <encoder>  
  8.         <pattern>  
  9.             [ %-5level] [%date{yyyy-MM-dd HH:mm:ss}] %logger{96} [%line] - %msg%n  
  10.         </pattern>  
  11.         <charset>UTF-8</charset> <!-- 此处设置字符集 -->  
  12.     </encoder>  
  13.   
  14.     <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
  15.       <!-- rollover daily 配置日志所生成的目录以及生成文件名的规则 -->  
  16.       <fileNamePattern>logs/mylog-%d{yyyy-MM-dd}.%i.log</fileNamePattern>  
  17.       <timeBasedFileNamingAndTriggeringPolicy  
  18.           class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">  
  19.         <!-- or whenever the file size reaches 64 MB -->  
  20.         <maxFileSize>64 MB</maxFileSize>  
  21.       </timeBasedFileNamingAndTriggeringPolicy>  
  22.     </rollingPolicy>  
  23.   
  24.   
  25.     <filter class="ch.qos.logback.classic.filter.ThresholdFilter">  
  26.       <level>DEBUG</level>  
  27.     </filter>  
  28.     <!-- Safely log to the same file from multiple JVMs. Degrades performance! -->  
  29.     <prudent>true</prudent>  
  30.   </appender>  
  31.   
  32.   
  33.   <!-- Console output -->  
  34.   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">  
  35.     <!-- encoder defaults to ch.qos.logback.classic.encoder.PatternLayoutEncoder -->  
  36.       <encoder>  
  37.           <pattern>  
  38.               [ %-5level] [%date{yyyy-MM-dd HH:mm:ss}] %logger{96} [%line] - %msg%n  
  39.           </pattern>  
  40.           <charset>GBK</charset> <!-- 此处设置字符集 -->  
  41.       </encoder>  
  42.     <!-- Only log level WARN and above -->  
  43.     <filter class="ch.qos.logback.classic.filter.ThresholdFilter">  
  44.       <level>WARN</level>  
  45.     </filter>  
  46.   </appender>  
  47.   
  48.   
  49.   <!-- Enable FILE and STDOUT appenders for all log messages.  
  50.        By default, only log at level INFO and above. -->  
  51.   <root level="INFO">  
  52.     <appender-ref ref="FILE" />  
  53.     <appender-ref ref="STDOUT" />  
  54.   </root>  
  55.   
  56.   <!-- For loggers in the these namespaces, log at all levels. -->  
  57.   <logger name="pedestal" level="ALL" />  
  58.   <logger name="hammock-cafe" level="ALL" />  
  59.   <logger name="user" level="ALL" />  
  60. </configuration>  



2,在application.properties中,指定log文件的加载路径,已经配置通用的log日志级别: 

Java代码   收藏代码
  1. #指定log的配置文件,以及记录Spring Boot的log级别  
  2. logging.config=logback.xml  
  3. 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














          

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值