精华内容
下载资源
问答
  • Springboot源码结构预览

    2021-06-13 09:36:41
    一、Springboot源码结构预览 二、Springboot运行原理 三、Springboot源码流程构造分析 四、Springboot运行流程构造分析 五、Springboot Web应用源码解析 文章目录系列文章目录概述二、Springboot源码1.源码获取2....

    系列文章目录

    Springboot学习系列
    一、Springboot源码结构预览
    二、Springboot运行原理
    三、Springboot源码流程构造分析
    四、Springboot运行流程构造分析
    五、Springboot Web应用源码解析



    概述

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。Springboot源码获取、调试、目录结构、设计理念、整体架构。


    二、Springboot源码

    1.源码获取

    源码地址:

     https://github.com/spring-projects/spring-boot
    

    在这里插入图片描述

    2.源码调试

    通常使用“实例+debug”方法对Spring Boot源代码进行调试与追踪。创建入口类代码:

    @SpringBootApplication
    public class DemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    }
    

    3.目录结构

    spring-boot-project:Spring Boot核心项目代码,包含核心、工具、安全、文档、starters等项目。
    spring-boot-tests:Spring Boot部署及集成的测试。

    spring-boot-project目录是在Spring Boot 2.0版本发布后新增的目录层级,该模块包含了Spring Boot所有的核心功能。

    模块功能
    spring-bootSpring Boot核心代码,也是入口类SpringApplication类所在项目,是本书重点介绍的内容。
    spring-boot-actuator提供应用程序的监控、统计、管理及自定义等相关功能。
    spring-boot-actuator-autoconfigureSpring Boot自动配置核心功能,默认集成了多种常见框架的自动配置类等。
    spring-boot-cli命令工具,提供快速搭建项目原型、启动服务、执行Groovy脚本等功能。
    spring-boot-dependencies依赖和插件的版本信息。
    spring-boot-docs参考文档相关内容。
    spring-boot-parentspring-boot-dependencies的子模块,是其他项目的父模块
    spring-boot-properties-migratorSpring Boot 2.0版本新增的模块,支持升级版本配置属性的迁移
    spring-boot-startersSpring Boot以预定义的方式集成了其他应用的starter集合
    spring-boot-test测试功能相关代码
    spring-boot-test-autoconfigure测试功能自动配置相关代码
    spring-boot-toolsSpring Boot工具支持模块,包含Ant、Maven、Gradle等构建工具

    3.设计理念与目标

    Spring所拥有的强大功能之一就是可以集成各种开源软件。Spring Boot本身并不提供Spring的核心功能,而是作为Spring的脚手架框架,以达到快速构建项目、预置三方配置、开箱即用的目的。

    3.1设计理念

    约定优于配置(Convention Over Configuration),又称为按约定编程,是一种软件设计范式,旨在减少软件开发人员需要做决定的数量,执行起来简单而又不失灵活。

    Spring Boot的功能从细节到整体都是基于“约定优于配置”开发的,从基础框架的搭建、配置文件、中间件的集成、内置容器以及其生态中各种Starters,无不遵从此设计范式。Starter作为Spring Boot的核心功能之一,基于自动配置代码提供了自动配置模块及依赖,让软件集成变得简单、易用。与此同时,Spring Boot也在鼓励各方软件组织创建自己的Starter

    3.2设计目标

    Spring Boot框架的设计理念完美遵从了它所属企业的目标,为平台和开发者带来一种全新的体验:整合成熟技术框架、屏蔽系统复杂性、简化已有技术的使用,从而降低软件的使用门槛,提升软件开发和运维的效率。

    4.Spring Boot的整体架构

    Spring Boot的核心项目结构及功能在这里插入图片描述


    总结

    本讲述了Springboot源码架构。

    展开全文
  • springboot + maven 多层级结构启动报错java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath SLF4J: Class path contains multiple SLF4J bindings...

    springboot + maven 多层级结构启动报错java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath

    SLF4J: Class path contains multiple SLF4J bindings.
    SLF4J: Found binding in [jar:file:/D:/maven/repository/org/slf4j/slf4j-log4j12/1.7.25/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:/D:/maven/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
    SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
    log4j:WARN No appenders could be found for logger (org.springframework.boot.devtools.settings.DevToolsSettings).
    log4j:WARN Please initialize the log4j system properly.
    log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
    Exception in thread “restartedMain” java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
    Caused by: java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.impl.Log4jLoggerFactory loaded from file:/D:/maven/repository/org/slf4j/slf4j-log4j12/1.7.25/slf4j-log4j12-1.7.25.jar). If you are using WebLogic you will need to add ‘org.slf4j’ to prefer-application-packages in WEB-INF/weblogic.xml: org.slf4j.impl.Log4jLoggerFactory
    at org.springframework.util.Assert.instanceCheckFailed(Assert.java:637)
    at org.springframework.util.Assert.isInstanceOf(Assert.java:537)
    at
    org.springframework.boot.logging.logback.LogbackLoggingSystem.getLoggerContext(LogbackLoggingSystem.java:286)
    at org.springframework.boot.logging.logback.LogbackLoggingSystem.beforeInitialize(LogbackLoggingSystem.java:102)
    at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationStartingEvent(LoggingApplicationListener.java:191)
    at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:170)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127)
    at org.springframework.boot.context.event.EventPublishingRunListener.starting(EventPublishingRunListener.java:68)
    at org.springframework.boot.SpringApplicationRunListeners.starting(SpringApplicationRunListeners.java:48)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1258)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1246)
    at com.zjyc.zdyt.api.cainiao.ZdytApiApplication.main(ZdytApiApplication.java:22)
    … 5 more

    Process finished with exit code 0

    jar包冲突
    解决办法:jar包冲突

    展开全文
  • 项目结构目录结构简介 项目结构目录整体上符合maven规范要求: 目录位置 功能 src/main/java 项目java文件存放位置,初始化包含主程序入口 XxxApplication 可以通过直接运行该类来 启动 Spring Boot应用 ...

    项目结构目录结构简介

    项目结构目录整体上符合maven规范要求:

    目录位置功能
    src/main/java项目java文件存放位置,初始化包含主程序入口
    XxxApplication可以通过直接运行该类来 启动 Spring Boot应用
    src/main/resources存放静态资源,图片、CSS、JavaScript、web页面模板文件等
    src/test单元测试代码目录
    .gitignoregit版本管理排除文件
    pom.xmlmaven项目配置文件
    application.properties(application.yml)用于存放程序的各种依赖模块的配置信息,比如服务端口,数据库连接配置等
    • src/main/resources/static主要用来存放css、图片、js等开发用静态文件
    • src/main/resources/public用来存放可以直接用于访问的html文件
    • src/main/resources/templates用来存放web开发模板文件
      附文:Spring Initializr
      如果IDEA没有Spring Initializr选项,先去安装这个IDEA插件。
      在这里插入图片描述
    展开全文
  • 这个让我比较困惑:它的功能是做两个字符串或日期的比较,但嵌套的层级比较多。 1.AttributeConditionOperationEnum:这个枚举类决定了比较的方向(小于大于相似) 2.AttributeTypeEnum:将多种类别的比较做成枚举...

    最基础的:controller,service,util,model
    常见的:exception,handler,constant,listener,config
    陌生的:holder,DataSource.marker,cache,comparator.attribute,

    config解释:

    @Configuration定义配置类,跟xml文件里的<Beans>做映射,@bean=<Bean>,存在bean不生效的情况'使用了默认的装配'使用@Primary解决
    @mapperscan注解:一般做do和tem绑定,在整个类里,需要注意的就是datasource。
    

    DataSource.marker

    实际上就是一些接口,用于做标记,作用跟自定义注解类似,但使用更为方便,不过需要在使用到的地方支持对接口做校验
    比如多数据源配置:MasterDataSourceMarker,依托于mapperscan的值’markerInterface’,然后连接信息上使用@ConfigurationProperties,映射到对应的xml文件,这样就实现了主从数据源的连接配置。

    @MapperScan(markerInterface = MasterDataSourceMarker.class,basePackages = 
    {"com.alphaliongroup.account.common.model"},sqlSessionTemplateRef = "masterSqlSessionTemplate")
    和
    public interface AccountTypeDetailAttributeDOMapper extends MasterDataSourceMarker {
    

    cache

    代码书写的原则就是尽可能复用,像cache,在多个地方都会用到,抽出来集中在一起,思路更加清晰。在很多项目里,代码都是在一直做重复,缺点显而易见:代码冗余繁杂,影响后续的业务。
    cahe在项目中的结构

    holder:

    这个命名让我有点奇怪,但它的本质不复杂,就是在干@autowired的活,像这种方式,实际上就是因为在项目没有启动时(一般是测试),spring不能为bean注入,所以选择手动的方式来做注入。当然@SpringBootTest实际上也是有一样的功能(这里暂时存疑,因为没有实践过)。

    public class ApplicationContextHolder {
        private static volatile ApplicationContext context = null;
    
        public static final ApplicationContext getContext(){
            return context;
        }
    
        public static final <T> T getBean(Class<T> clazz){
            return context.getBean(clazz);
        }
    
        public static void setApplicationContext(ApplicationContext applicationContext) {
            context = applicationContext;
        }
    }
    

    exception和handler

    exception没什么可说的,就是自定义异常,一般也只会有message作为异常处理的方法参数。handler则是对应的统一异常返回,需要注意的是返回给前端页面的一般是json格式的数据,需要特别注意。

    /**
     * @author vic 定义全局异常处理
     * @RestControllerAdvice 是@controlleradvice 与@ResponseBody 的组合注解
     */
    @RestControllerAdvice
    @Slf4j
    public class GlobalControllerExceptionHandler {
    
        public static final String NOT_NULL_NOTICE = "should not be null";
    
        @ExceptionHandler(value = {BindException.class})
        @ResponseStatus(HttpStatus.UNPROCESSABLE_ENTITY)
        public Result bindException(BindException ex) {
            log.error("", ex);
            return Result.fail(ex.getFieldError().getField() + ": " + ex.getFieldError().getRejectedValue()+","+ex.getFieldError().getDefaultMessage());
        }
    

    comparator.attribute:

    这个让我比较困惑:它的功能是做两个字符串或日期的比较,但嵌套的层级比较多。

    1.AttributeConditionOperationEnum:这个枚举类决定了比较的方向(小于大于相似)
    2.AttributeTypeEnum:将多种类别的比较做成枚举类,DATE("date",new DateAttributeConditionMatcher())
    3.AttributeConditionMatcher:接口
    4.DateAttributeConditionMatcher,TextAttributeConditionMatcher:实现
    
    使用:
    AttributeTypeEnum attributeTypeEnum = AttributeTypeEnum.TEXT;
                            if(attributeMap.get(entry.getKey()) != null) {
                                flag = flag && attributeTypeEnum.getMatcher().match(entry.getValue(), 
                                String.valueOf(attributeMap.get(entry.getKey())), enumMapMap.getKey());
    

    listener:

    简单介绍一下通过自定义注解来控制监听的接口
    自定义注解监听可以对请求做监听,kafka topic的监听可以使用直接监听
    通过自定义注解@permission,以及value(这里还写了一个常量类来控制)

    ApplicationListener<ContextRefreshedEvent> :核心接口,实现该接口,补全onApplicationEvent方法,
    我们自定义的监听处理器生效,同时所有的监听上的逻辑处理也在这里完成。
    
    @Permission(Permissions.Account)
    public class AccountController {
    每个接口都绑定了对应的permission,获取到注解,再做对应解析,就能做监听
    步骤
    WorkflowEventDispatcher.addListener(type, workflowListener);
    将所写的监听加入,怎么确定监听范围(接口数量?)
    
    展开全文
  • SpringBoot—分层结构

    2021-02-17 20:14:21
    SpringBoot编程的分层架构 SpringBoot服务端负载均衡集群部署架构 SpringBoot客户端负载均衡集群部署架构 SpringBoot编程的分层架构,三层分别为 Controller 控制层 Service 服务层 Dal 数据层 SpringBoot...
  • springboot学习总结

    2021-07-26 17:05:31
    这篇文章不涉及springboot的配置和相关设置,只是对springboot层级结构和使用方法的梳理和总结。 首先要明白springboot是做什么的,它写好后,是你把后端程序打包上传到服务器,在服务器上运行。 mapper就是dao,...
  • 自动装配 静态资源 优先级:resources >static > public #public:公共的资源 都访问的js #resources:上传的一些文件 #static:静态资源 图片 自定义之后默认失效 spring.mvc.static-path-pattern=/xxxxx/...
  • 代码层级梳理 代码层级 annotation层 ExcelVoAttribut 主要用于写@ExcelVoAttribute注解,可以更灵活的配置Excel数据表导出的一些基本配置 LogDirection 主要用于写@LogDirection注解,注解里包含一个字段(接口...
  • 项目结构及idea包层级结构设置以及项目目命名规范
  • 新建springboot项目目录结构不全

    千次阅读 2020-02-02 13:08:22
    今天呢,在家里无聊,去看了看dubbo的视频然后,在新建springboot项目的时候出现了问题,建立以后出现了目录结构不全的现象,如图所示,我在新建项目的时候选择的是,jar包,没有选中任何的 然后这就是问题的全部,...
  • Springboot

    2021-09-17 22:20:38
    springboot
  • springboot

    2021-09-13 20:50:18
    springboot
  • SpringBoot

    2021-08-13 19:21:55
    1 SpringBoot高级用法 1.1 properties配置文件说明 数据结构:key-value结构 写法:key=value “key”=“value” 数据类型:都是字符串,...写法:key:(空格)value (编辑时注意层级结构) 字符集编码:默认都是utf-
  • Springboot项目的分层结构

    千次阅读 2020-04-23 11:56:35
    用于存放Springboot相关的配置类,包括启动类。 2.Controller:请求入口 所有请求的入口,前后端交互的入口。 3.Service:逻辑层 负责所有的业务逻辑 4.Mapper层:持久层 或叫Dao,持久层,负责java和数据库交互。...
  • springBoot

    2019-10-25 14:31:19
    2.springboot框架如何搭建 3.Actuator 使用 1.框架来源 Spring Boot是构建所有基于Spring的应用程序的起点。Spring Boot旨在尽可能快地启动和运行,只需最少的Spring前端配置。自己内部添加了单独tomcat服务器....
  • 1.SpringBoot项目结构 2.构建springBoot项目 项目基本层级关系 添加依赖 添加父模块依赖 添加子模块(API)依赖 添加model子模块maven依赖 添加server子模块依赖 ...
  • } /** * 将查询表中的所有数据处理成树形层级数据 * @return ReviewGuidelines list集合 */ @Override public List listWithTree() { //查询review_guidelines表所有数据 List rgs = queryAll(); //获取为父节点的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,012
精华内容 1,604
关键字:

springboot层级结构

spring 订阅