设为首页 收藏本站
查看: 948|回复: 0

[经验分享] 一键式Spring集成工具 Spring Boot

[复制链接]

尚未签到

发表于 2017-3-1 08:46:40 | 显示全部楼层 |阅读模式
  最近公司使用Spring boot进行开发,稍微了解一下,不过自我感觉把集中式配置applicate.properties搞明白,注解用过Spring MVC的boot绝对没问题的
  比如拦截器:@Aspect
  public class ControllerAspect {
  //对 com.store59.creditmall.controller包下面的所有类的所有带request对象的方法 进行拦截
  @Before("execution(* com.store59.creditmall.controller.*.*(javax.servlet.http.HttpServletRequest, ..))")
    public void proController(JoinPoint point) {
  Object[] args = point.getArgs();
  if (args.length > 0 && args[0] instanceof HttpServletRequest) {
              HttpServletRequest request = (HttpServletRequest) args[0];//获取request对象
  ...
  }
  }
  再比如@Controller,方法前加 @RequestMapping注释,可以设置web页面访问该方法的路径...
  下面这篇文章写的不错,转载过来
  转自http://my.oschina.net/u/1027043/blog/406558
  Spring Boot提供了一个强大的一键式Spring的集成开发环境,能够单独进行一个Spring应用的开发,其中:
(1)集中式配置(application.properties)+注解,大大简化了开发流程
(2)内嵌的Tomcat和Jetty容器,可直接打成jar包启动,无需提供Java war包以及繁琐的Web配置
(3)提供了Spring各个插件的基于Maven的pom模板配置,开箱即用,便利无比。
(4)可以在任何你想自动化配置的地方,实现可能
(5)提供更多的企业级开发特性,如何系统监控,健康诊断,权限控制
(6) 无冗余代码生成和XML强制配置
(7)提供支持强大的Restfult风格的编码,非常简洁
当然Spring Boot提供的功能,远远比上面的强大,散仙会在后续文章中,逐渐以实际工作中的项目为背景,穿插记录使用Spring Boot的心得体会。
下面看一个入门级的例子:
pom依赖:





Java代码   DSC0000.png

  • <?xml version="1.0" encoding="UTF-8"?>  
  • <project xmlns="http://maven.apache.org/POM/4.0.0"  
  •          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  •          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  •     <modelVersion>4.0.0</modelVersion>  

  •     <groupId>com.spring.boot</groupId>
  •     <artifactId>springboot</artifactId>
  •     <version>1.0-SNAPSHOT</version>  

  •     <parent>
  •         <groupId>org.springframework.boot</groupId>
  •         <artifactId>spring-boot-starter-parent</artifactId>
  •         <version>1.2.3.RELEASE</version>  
  •     </parent>
  •     <dependencies>
  •         <dependency>
  •             <groupId>org.springframework.boot</groupId>
  •             <artifactId>spring-boot-starter-web</artifactId>
  •         </dependency>
  •     </dependencies>
  • </project>
  
核心代码:



Java代码  

    • package controller;  

    • import org.springframework.boot.SpringApplication;  
    • import org.springframework.boot.autoconfigure.EnableAutoConfiguration;  
    • import org.springframework.stereotype.Controller;  
    • import org.springframework.web.bind.annotation.RequestBody;  
    • import org.springframework.web.bind.annotation.RequestMapping;  
    • import org.springframework.web.bind.annotation.ResponseBody;  

    • /**
    • * Created by 三劫散仙 on 2015/4/24.
    • */  
    • @Controller  
    • @EnableAutoConfiguration  
    • public class HellowController {  



    •     @RequestMapping("/hellow")  
    •     @ResponseBody  
    •     public String hellow(){  

    •         return "哈喽,Spring Boot !";  
    •     }


    •     public static void main(String[] args) {  
    •         //第一个简单的应用,  
    •         SpringApplication.run(HellowController.class,args);  

    •     }

    • }

  好了,多说了点废话,下面看下本篇记录Spring Boot的几个知识点:
(一)一个Maven+Spring Boot项目基本的包结构形式
(二)一个简单的在Spring Boot项目集成安全控制
(二)如何在Spring Boot中记录log日志
(四)Spring Boot中几个常用注解介绍
ok下面开始正题:
(一)先看下,官网给出的一个简单的包结构组成:




Java代码    DSC0001.png

  • com
  • +- example
  •      +- myproject
  •          +- Application.java
  •          |
  •          +- domain
  •          |   +- Customer.java
  •          |   +- CustomerRepository.java
  •          |
  •          +- service
  •          |   +- CustomerService.java
  •          |
  •          +- web
  •              +- CustomerController.java
  
然后,看下散仙实际工作中的项目结构:

DSC0002.png    

需要注意的地方如下:
1,在src/main/java包下的第一层结构中,是必须放一个含有main方法的主启动的类,而且只能有一个main方法,如果再出现其他的main方法,在使用maven编译打包时,会报编译错误,当然在src/test/java包下,可以出现多个,但建议最好使用Junit进行单元测试.
这个main方法启动,就会启动内嵌的tomcat或jetty容器,然后加载所有需要加载的或扫描的类或资源文件。上篇博客中,散仙为了测试方便,是直接在当前的Conroller中,启动了一个测试服务,这样做适合单独调试,如果是生产环境下的启动方法,则是散仙前面所讲的,在java包的根目录下建立一个main方法类,负责启动所有的资源。
在本例中,散仙的main代码如下:




Java代码   

  • package com.dhgate.rate;

  • import org.springframework.boot.SpringApplication;
  • import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
  • import org.springframework.context.annotation.ComponentScan;
  • import org.springframework.context.annotation.Configuration;

  • @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的配置简单的安全访问控制,这一点非常容器,我们只需要做如下二步,即可。
1,在pom文件中,引入spring-boot-starter-security的maven依赖。




Xml代码   

  • <dependency>
  •         <groupId>org.springframework.boot</groupId>
  •         <artifactId>spring-boot-starter-security</artifactId>
  •     </dependency>
  
2,在application.properties中,配置访问的用户名和密码




Java代码   

  • #用户名 密码配置
  • security.user.name=admin
  • security.user.password=test
  
再次,访问链接时,会出现以下,拦截页面,就代表配置成功:

DSC0003.png

当然这只是,一个初级的配置,更复杂的配置,可以分不用角色,在控制范围上,能够拦截到方法级别的权限控制。
(三)日志的重要性,不言而喻,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
  

(四)介绍下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官方不推荐)
我们可以根据熟悉程度来选择自己喜欢的引擎。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-348569-1-1.html 上篇帖子: [Spring] spring-session + JedisPool 实现 session 共享 下篇帖子: Spring + SpringMVC + Druid + JPA(Hibernate impl) 给你一个稳妥的后端解决方案
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表