Spring Boot开发之流水无情(二)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:       http://my.oschina.net/u/1027043/blog/406558     上篇散仙写了一个很简单的入门级的Spring Boot的例子,没啥技术含量,不过,其实学任何东西只要找到第一个突破口,接下来的事情就好办了,人最怕什么? 我想莫过于干一件事情,没...

 

 

 

 

http://my.oschina.net/u/1027043/blog/406558 

   

上篇散仙写了一个很简单的入门级的Spring Boot的例子,没啥技术含量,不过,其实学任何东西只要找到第一个突破口,接下来的事情就好办了,人最怕什么? 我想莫过于干一件事情,没有下手的地方了,而当你一旦找到了这感觉,就可以很喜悦的顺藤摸瓜般的探索你强烈想探索求知的某种事物了,这种冥冥之中玄而又玄的感觉是什么?回想一下: 

(1) 当你把第一个某种编程语言的Hello World的例子,成功的运行在一个IDE中 
(2) 当你第一次从老家出发到达了某个你从未涉足过的地方 
(3) 当你成功的完成了第一次网购 

一切的不相关的事物之间的,其实都有类似的学习历程,正是所谓的触类旁通,万法归宗! 

关于Spring Boot这块,其实里面涉及的内容非常多也非常灵活,散仙的项目中用到的模块也只是冰山一角,不可能完全覆盖所有有关的模块,完全是为了项目而用技术,不是为了技术而诞生了这个项目,所以这次记录的心得,完全是项目有关的,而不是Spring Boot一个学习教程,这一点,希望各位看官明白,如果想专攻学习Spring Boot,推荐点击官网更详细的教程 
一个项目是由多种不同层面的技术组成的,所以散仙不会只写有关Spring Boot方面的,虽然Spring Boot是主线。大多数情况下,都会集成多种不同的技术,只有各自发挥自己擅长的优势,才能组合出最优的架构。 

好了,多说了点废话,下面看下本篇记录Spring Boot的几个知识点: 

(一)一个Maven+Spring Boot项目基本的包结构形式 
(二)一个简单的在Spring Boot项目集成安全控制 
(二)如何在Spring Boot中记录log日志 
(四)Spring Boot中几个常用注解介绍 

ok下面开始正题: 

(一)先看下,官网给出的一个简单的包结构组成: 

Java代码    收藏代码
  1. com  
  2.  +- example  
  3.      +- myproject  
  4.          +- Application.java  
  5.          |  
  6.          +- domain  
  7.          |   +- Customer.java  
  8.          |   +- CustomerRepository.java  
  9.          |  
  10.          +- service  
  11.          |   +- CustomerService.java  
  12.          |  
  13.          +- web  
  14.              +- CustomerController.java  



然后,看下散仙实际工作中的项目结构: 



   


需要注意的地方如下: 
1,在src/main/java包下的第一层结构中,是必须放一个含有main方法的主启动的类,而且只能有一个main方法,如果再出现其他的main方法,在使用maven编译打包时,会报编译错误,当然在src/test/java包下,可以出现多个,但建议最好使用Junit进行单元测试. 

这个main方法启动,就会启动内嵌的tomcat或jetty容器,然后加载所有需要加载的或扫描的类或资源文件。上篇博客中,散仙为了测试方便,是直接在当前的Conroller中,启动了一个测试服务,这样做适合单独调试,如果是生产环境下的启动方法,则是散仙前面所讲的,在java包的根目录下建立一个main方法类,负责启动所有的资源。 

在本例中,散仙的main代码如下: 

Java代码    收藏代码
  1. package com.dhgate.rate;  
  2.   
  3. import org.springframework.boot.SpringApplication;  
  4. import org.springframework.boot.autoconfigure.EnableAutoConfiguration;  
  5. import org.springframework.context.annotation.ComponentScan;  
  6. import org.springframework.context.annotation.Configuration;  
  7.   
  8. @Configuration//配置控制  
  9. @EnableAutoConfiguration//启用自动配置  
  10. @ComponentScan//组件扫描  
  11. public class ApplicationMain {  
  12.     public static void main(String[] args) throws Exception {  
  13.         //启动Spring Boot项目的唯一入口  
  14.         SpringApplication.run(ApplicationMain.class, args);  
  15.   
  16.     }  
  17.   
  18. }  




2,在src/main/resource目录下面,是放置一些配置文件,或模板支持的文件,如JSP,Velocity,Freemaker等,这里面比较常用或重要的一个文件,就是Spring Boot的集中式配置文件application.properties这个文件了,这里面给其他大部分的组件,提供了一个可集中管理和配置的中心,包括安全控制,redis,solr,mangodb的连接信息,以及数据库连接池,容器端口号,jmx,java mail,动态模板等。此外这个目录下默认是可以访问静态资源的,比如我们的css,js,或者第三方的一些引用文件等。 

(二)关于在Spring Boot的配置简单的安全访问控制,这一点非常容器,我们只需要做如下二步,即可。 
1,在pom文件中,引入spring-boot-starter-security的maven依赖。 

Xml代码    收藏代码
  1. <dependency>  
  2.         <groupId>org.springframework.boot</groupId>  
  3.         <artifactId>spring-boot-starter-security</artifactId>  
  4.     </dependency>  



2,在application.properties中,配置访问的用户名和密码 

Java代码    收藏代码
  1. #用户名 密码配置  
  2. security.user.name=admin  
  3. security.user.password=test  



再次,访问链接时,会出现以下,拦截页面,就代表配置成功: 


 


当然这只是,一个初级的配置,更复杂的配置,可以分不用角色,在控制范围上,能够拦截到方法级别的权限控制。 

(三)日志的重要性,不言而喻,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  





(四)介绍下Spring Boot中几个常用的注解,其中大部分都是来自Spring MVC的注解,这些注解使用的频率一般都在90%之上。 

(1)@RestController和@Controller指定一个类,作为控制器的注解 
(2)@RequestMapping方法级别的映射注解,这一个用过Spring MVC的小伙伴相信都很熟悉 
(3)@EnableAutoConfiguration和@SpringBootApplication是类级别的注解,根据maven依赖的jar来自动猜测完成正确的spring的对应配置,只要引入了spring-boot-starter-web的依赖,默认会自动配置Spring MVC和tomcat容器 
(4)@Configuration类级别的注解,一般这个注解,我们用来标识main方法所在的类 
(5)@ComponentScan类级别的注解,自动扫描加载所有的Spring组件包括Bean注入,一般用在main方法所在的类上 
(6)@ImportResource类级别注解,当我们必须使用一个xml的配置时,使用@ImportResource和@Configuration来标识这个文件资源的类。 
(7)@Autowired注解,一般结合@ComponentScan注解,来自动注入一个Service或Dao级别的Bean 
(8)@Component类级别注解,用来标识一个组件,比如我自定了一个filter,则需要此注解标识之后,Spring Boot才会正确识别。 



ok,本篇的讲解,就到此结束,这些都是项目工程的基础知识,了解这些,有助于我们快速的上手一个Spring Boot应用。 

下篇博客的内容会写: 
(1)如何在Spring Boot项目中集成Spring Loaded框架,来完成模块热加载和代码动态编译,有了这个东西,我们开发的效率会更加高效,大部分情况下我们改了一个类或方法的代码之后,都不需要重启应用,因为Spring Loaded会定时重新编译并加载代码。 

(2)如何在Spring Boot项目中集成Velocity,Spring Boot支持多种模板引擎,包括 
1,FreeMarker 
2,Groovy 
3,Thymeleaf 
4,Velocity 
5,JSP (Spring Boot官方不推荐) 
我们可以根据熟悉程度来选择自己喜欢的引擎。 

目录
相关文章
|
27天前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
38 4
|
1月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
52 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
21天前
|
XML Java 数据格式
提升效率!Spring Boot 开发中的常见失误轻松规避
本文深入探讨了在 Spring Boot 开发中常见的失误,包括不当使用注解、不良异常处理、低效日志记录等,提供了有效的规避策略,帮助开发者提升代码质量和系统性能,构建更健壮、高效的应用程序。
|
5天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
10 0
|
2月前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
1958 17
|
1月前
|
Java 数据库连接 Spring
【2021Spring编程实战笔记】Spring开发分享~(下)
【2021Spring编程实战笔记】Spring开发分享~(下)
25 1
|
1月前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
50 2
|
1月前
|
开发框架 Java API
「SpringBrick快速入门指南」:一款基于Spring Boot的高级插件化开发框架
「SpringBrick快速入门指南」:一款基于Spring Boot的高级插件化开发框架
46 0
|
1月前
|
XML Java 数据格式
手动开发-简单的Spring基于注解配置的程序--源码解析
手动开发-简单的Spring基于注解配置的程序--源码解析
45 0
|
1月前
|
XML Java 数据格式
手动开发-简单的Spring基于XML配置的程序--源码解析
手动开发-简单的Spring基于XML配置的程序--源码解析
76 0