Spring Boot 之主启动类

主启动类

@SpringBootApplication

作用
  • SpringBoot 项目中都有主启动类用来启动项目

    • 启动类上使用 @SpringBootApplication 注解
    • 标注这是 SpringBoot 应用
  • @SpringBootApplication

    • 注解在主类上,复合注解:由多个注解组成
      1. @SpringBootConfiguration
      2. @EnableAutoConfiguration
      3. @ComponentScan
    • 主类定义在主包中,和各模块同级
    • 可以自动创建主类所在包及子包的 bean 对象
  • 主类作用

    1. 判断应用类型:普通项目 或 Web 项目
    2. 查找并加载所有可用初始化器,设置到 initializers 属性
    3. 加载所有监听器程序,设置到 listeners 属性
    4. 判断并设置 main() 方法定义类,找到运行主类
  • Spring Boot 自动装配流程

    • 在这里插入图片描述
package li_maven;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 主类,启动项目;包括 Tomcat 服务器
 * @SpringBootApplication 注解中包含多个注解
 * 可以将本类当作配置文件使用。 使用 @Bean 注解声明对象并放入容器
 * 可以自动配置对象并放到容器:例如 MyBatis 需要的对象
 * 扫描注解创建对象:默认扫描范围 此注解所在类所在的包及子包
 */
@SpringBootApplication
public class SpringBootDemoApplication {

    /**
     * 执行程序启动:执行 SpringApplication.run() 方法
     * 方法内传参:本类 Class 对象,args 
     * 固定执行写法
     */
    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemoApplication.class, args);
    }

}
@SpringBootConfiguration
  • 包含 @Configuration 注解
    • 可以作为配置类、配置文件使用
    • 可使用 @Bean 声明对象注入到容器
    • 包含 @Component 注解
      • 说明此类也是 spring 组件
@EnableAutoConfiguration
  • 启用自动配置

    • 将 Java 对象配置好注入到 Spring 容器中
    • 例如:自动创建 MyBatis 对象放到容器
  • 复合注解,包含以下注解:实现自动装配

    • @AutoConfigurationPackage
    • @Import({AutoConfigurationImportSelector.class})
  • 加载自动配置类的时候,并非将 spring.factories 的配置全部加载进来

    • 而是通过 @Conditional 等注解的判断进行动态加载
@AutoConfigurationPackage
  • 包含 @AutoConfigurationPackage:自动导入配置包

    • 将主配置类所在的包下面所有组件都扫描注冊到 spring 容器
  • 包含 @Import({AutoConfigurationPackages.Registrar.class})

    • @Import 为 spring 的注解:导入一个配置文件
      • 在 SpringBoot 中是给容器导入一个组件
      • 导入的组件由 AutoConfigurationPackages.class 的内部类 Registrar.class 执行逻辑来决定如何导入
    • Registrar 实现了 ImportBeanDefinitionRegistrar
      • 可以被注解 @Import 导入到 spring 容器
@Import
  • @Import({AutoConfigurationImportSelector.class})
    • 开启自动配置类的导包的选择器
    • 即:带入哪些类,有选择性的导入
  • @Import 支持导入的三种方式
    1. 带有 @Configuration 注解的配置类
    2. ImportSelector 的实现
    3. ImportBeanDefinitionRegistrar 的实现
自动装配流程

自动装配在 AutoConfigurationImportSelector 类中进行以下流程

  1. selectImports(AnnotationMetadata annotationMetadata):选择需要导入的组件

    • 调用 getAutoConfigurationEntry() 方法
  2. getAutoConfigurationEntry(AnnotationMetadata annotationMetadata)

    • 根据导入的配置类的 AnnotationMetadata 返回 AutoConfigurationImportSelector.AutoConfigurationEntry
    • 调用 getCandidateConfigurations()方法找到所有候选的配置类
  3. getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes)

    • 找到所有候选的配置类

      • 经过去重,去除需要的排除的依赖
      • 最终的组件才是环境需要的所有组件
    • 有自动配置,不需要手写配置的值;配置类有默认值

    • 调用 SpringFactoriesLoader.loadFactoryNames() 方法找到需要配置的组件

    • 断言判断调用方法返回的结果

      • loadFactoryNames() 方法找到自动的配置类返回才不会报错
  4. loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader)

    • 传入参数:this.getSpringFactoriesLoaderFactoryClass()

      • 返回值:EnableAutoConfiguration.class

        • @SpringBootApplication 注解下标识的同一个注解
      • 即获取一个能加载自动配置类的类

        • SpringBoot 默认自动配置类为 EnableAutoConfiguration
      • this.getBeanClassLoader()

        • 返回值:this.beanClassLoader
    • String factoryTypeName = factoryType.getName();

      • factoryTypeEnableAutoConfiguration.class
    • ClassLoader classLoaderToUse = classLoader

      • 当传入类加载器为空时:
        • classLoaderToUse = SpringFactoriesLoader.class.getClassLoader()
    • 返回值:调用 loadSpringFactories() 转为 List 集合返回

      • 方法返回值 Map 集合
      • 调用 getOrDefault(factoryTypeName, Collections.emptyList())
        • factoryTypeName 值是 EnableAutoConfiguration
        • 获取对应的 value
          • META-INF/spring.factories 文件下
          • keyorg.....EnableAutoConfiguration 得值对应的 value
        • value 不存在时返回默认值空数组
  5. loadSpringFactories(ClassLoader classLoader):返回 Map 集合

    • 先从缓存中根据传进来的类加载器加载组件得到 Map result
      • result 不为 null 时直接返回
      • 为 null 时创建新的 HashMap result
    • Enumeration urls = classLoader.getResources("META-INF/spring.factories")
      • 固定资源路径:META-INF/spring.factories
      • 加载引入 jar 包当前类路径下的 META-INF/spring.factories 文件
      • 将所有资源加载到 Propeties 配置文件中
        • 从其中获取对应的自动装配类
      • 获取到组件后放入 result 集合中(此时强转为 List)
        • key:文件中定义的一些标识工厂类
        • value:能自动配置的一些工厂实现的类
          • value 用 List 保存并去重
      • 将 classLoader 作为 key,result 作为 value 放入缓存
        • 下一次加载时可以直接使用
      • 返回 result
    • 方法作用
      • 加载所有依赖的路径 META-INF/spring.factories 文件
      • 通过 map 结构保存
        • key:文件中定义的一些标识工厂类
        • value:能自动配置的一些工厂实现的类
          • value 用 list 保存并去重
    • SpringFactoriesLoader 工厂加载机制
      • Spring内部提供的一个约定俗成的加载方式
      • 只需要在模块的 META-INF/spring.factories 文件
        • Properties 格式的文件中
          • key:接口、注解、或抽象类的全名
          • value:以,分隔的实现类
        • 使用 SpringFactoriesLoader 实现相应的实现类注入 Spirng 容器
      • 加载所有 jar 包下的 classpath 路径下的 META-INF/spring.factories 文件
        • 这样文件不止一个
自动配置原理
  1. SpringBoot 启动的时候加载主配置类

    • @EnableAutoConfiguration 注解开启自动配置功能
  2. @EnableAutoConfiguration 作用

    • 利用 EnableAutoConfigurationImportSelector 给容器中导入一些组件
    • 查看 selectImports() 方法的内容
      • List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
        • 获取候选的配置
      • SpringFactoriesLoader.loadFactoryNames()
        • 扫描所有jar包类路径下 META-INF/spring.factories
        • 把扫描到的文件的内容包装成 properties 对象
        • properties 中获取 EnableAutoConfiguration.class 类(类名)对应的值
        • 然后把他们添加在容器中
    • 将类路径 META-INF/spring.factories 里面配置的所有 EnableAutoConfiguration 的值加入到了容器
    • 这样的 xxxAutoConfiguration 类都是容器中的一个组件,都加入到容器中,用他们来做自动配置
  3. 对每一个自动配置类进行自动配置功能

    • HttpEncodingAutoConfiguration 为例解释自动配置原理
      • Http 编码自动配置
    • 所有配置文件中能配置的属性都是在 xxxxProperties 类中封装
      • 配置文件的配置可以参照某个功能对应的属性类
    • 在配置文件中设置属性之后会自动装配到配置类中
      • 实现对配置文件的设置
    @Configuration 						// 表示这是一个配置类,和配置文件一样,也可以给容器中添加组件
    /* 
    启动指定类的 ConfigurationProperties 功能;
    将配置文件中对应的值和 HttpEncodingProperties 绑定起来;
    并把 HttpEncodingProperties 加入到ioc容器中 
    */
    @EnableConfigurationProperties(HttpEncodingProperties.class) 
    /* 
    Spring 底层 @Conditional 注解(Spring注解版),
    如果满足指定的条件,整个配置类里面的配置就会生效;
    判断当前应用是否是 web 应用,如果是,当前配置类生效 
    */
    @ConditionalOnWebApplication 
    // 判断当前项目有没有 CharacterEncodingFilter:SpringMVC中进行乱码解决的过滤器;
    @ConditionalOnClass(CharacterEncodingFilter.class) 
    /* 
    判断配置文件中是否存在配置:spring.http.encoding.enabled,如果不存在,判断也成立
    即使配置文件中不配置 pring.http.encoding.enabled=true,也默认生效的
    */
    @ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true) 
    public class HttpEncodingAutoConfiguration {
    
        // 和 SpringBoot 的配置文件映射
        private final HttpEncodingProperties properties;
    
        // 只有一个有参构造器的情况下,参数的值就会从容器中拿
        public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
            this.properties = properties;
        }
    
        @Bean // 给容器中添加一个组件,组件的某些值需要从 properties 中获取
        @ConditionalOnMissingBean(CharacterEncodingFilter.class) // 判断容器是否有这个组件
        public CharacterEncodingFilter characterEncodingFilter() {
            CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
            filter.setEncoding(this.properties.getCharset().name());
            filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
            filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
            return filter;
        }
    }
    
  • 当需要其他的配置时
    • 如监听相关配置:listenter
    • 传入不同的参数,获取相关的 listenter 配置
  • 只有自动配置类进入到容器中以后,这个自动配置类才开始进行启动
  • 通过 @Conditional 等注解的判断进行动态加载
    • 加载自动配置类的时候,并非将 spring.factories 的配置全部加载进来
@ComponentScan
  • 组件扫描器,配置用于 Configuration 类的组件扫描指令
    • 类似 <context:component-scan>
    • basePackageClassesbasePackages 来定义要扫描的特定包
  • 默认扫描 @ComponentScan 所在类的同级包和子包
    • 没有定义特定的包,将从声明该注解的类的包开始扫描

run()

  • SpringApplication.run() 方法启动流程
  • 作用
    • 判断应用类型:普通项目 或 Web 项目
    • 查找并加载所有可用初始化器,设置到 initializers属性
    • 加载所有监听器程序,设置到 listeners属性
    • 判断并设置 main() 方法定义类,找到运行主类

在这里插入图片描述

ApplicationContext

  • 手动获取容器对象

    • SpringApplication.run() 方法返回 Spring 容器对象

      • 返回值类型:ConfigurableApplicationContext
      • 此接口继承 ApplicationContext 接口
    • 再获取业务 bean 进行调用

//持久层类,注解创建对象放到容器中
@Repository
class Demo{
    //类定义略
}

//主类,启动时扫描同级、下级目录注解对象放到容器
@SpringBootApplication
public class DemoApplication{
    public static void main(String[] args){
        //获取容器对象
        ApplicationContext context = SpringApplication.run( DemoApplication.class, args);
        //从容器中的得到 bean 对象
        Demo demo = (Demo)context.getBean("demo");
        System.out.println(demo);
    }
}

启动后执行

  • 开发中可能需要在容器启动后执行一些内容
    • 比如:读取配置文件、数据库连接之类
  • 四种实现方式
    1. 注解:@PostConstruct
    2. 实现 CommandLineRunner 接口
    3. 实现 ApplicationRunner 接口
    4. 实现 ApplicationListener 接口
  • 执行顺序
    1. 注解 @PostConstruct 始终最先执行
    2. 监听 ApplicationStartedEvent 事件
    3. ApplicationRuner 默认优先执行
    4. CommandLineRunner 默认后执行
      • 若两个接口都指定了 @Order 则按数字大小执行
      • 数字越小优先级越高
    5. 监听 ApplicationReadyEvent 事件
@PostConstruct
  • Java 自带注解,注解在方法上会在项目启动时执行该方法
    • Spring 容器初始化时执行
  • 执行顺序
    1. 构造函数
    2. @Autowired
    3. @PostConstruct
  • 注意事项
  • 方法不能有参数
  • 方法返回值为 void
  • 方法不能抛出已检查异常
  • 方法是非静态方法
  • 方法只会被执行一次
  • 耗时长的逻辑应放到独立线程,减少容器初始化时间
  • 容器加载过程
    • SpringBoot 将标记 Bean 的相关注解的类或接口自动初始化全局单一实例
      • 当未标记初始化顺序时按照默认顺序进行初始化
      • 初始化过程中执行一个 Bean 的构造方法后会执行该类存在的 @PostConstruce 方法,之后再初始化下一个 Bean
    • @PostConstruct 方法中逻辑处理时间过长时会增加 SpringBoot 初始化 Bean 时间,增加应用启动时间
      • 只有 Bean 初始化完成后才会打开端口服务,所以初始化完成前应用不可访问
两个接口
  • SpringBoot 提供两个接口实现这种需求,容器启动成功后的最后一步回调

    • CommandLineRunner
      • run 方法参数:String 数组
    • ApplicationRunner
      • run 方法参数:ApplicationArguments
      • 参数格式:K=V
    • 实现接口中重写 run() 方法实现即可
      • 两个接口的 run 方法参数不同,效果相同
    • 容器对象创建之后自动执行 run 方法
      • 完成容器对象创建之后的自定义操作
        • 容器对象创建的同时会将容器中的对象创建
        • run 方法中可以获取容器中的对象使用
      • 控制执行顺序
        1. 通过 @Order 注解指定优先级
          • 数字越小优先级越高
        2. 通过 Ordered 接口控制执行顺序
      • 方法执行时项目已初始化完毕,可以正常提供服务
  • 示例

    • package com.example.demo2;
      import org.springframework.boot.CommandLineRunner;
      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;
      /**
       * 实现 CommandLineRunner 接口,Order 设置为 1 使优先级最高
       */
      @SpringBootApplication
      @Order(value = 1)
      public class Demo2Application implements CommandLineRunner {
          public static void main(String[] args) {
              SpringApplication.run(Demo2Application.class, args);
          }
          // 覆写接口的 run 方法,在容器创建后自动执行
          @Override
          public void run(String... args) throws Exception {
      
          }
      }
      
      package li_maven.springboot;
      
      import org.springframework.boot.ApplicationArguments;
      import org.springframework.boot.ApplicationRunner;
      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;
      /**
       * 实现 ApplicationRunner 接口,Order 设置为 2 优先级次高
       */
      @Order(value = 2)
      @SpringBootApplication
      public class Application implements ApplicationRunner {
          
          public static void main(String[] args) {
              SpringApplication.run(Application.class, args);
          }
          
          @Override
          public void run(ApplicationArguments args) throws Exception {
              System.out.println("启动后自动执行");
          }
      }
      
      
ApplicationListener
  • 和另两个接口实现一样都不影响服务,可以正常提供服务

  • 监听事件通常是 ApplicationStartedEventApplicationReadyEnvent

    • 其他事件可能无法注入 Bean
  • 使用

    • package li_maven.springboot;
      
      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;
      import org.springframework.context.ApplicationEvent;
      import org.springframework.context.ApplicationListener;
      
      @SpringBootApplication
      public class Application implements ApplicationListener {
          
          public static void main(String[] args) {
              SpringApplication.run(Application.class, args);
          }
           
          @Override
          public void onApplicationEvent(ApplicationEvent event) {
              
          }
      }
      
      
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringCloud微服务课程说明 1 网站架构演变过程 1 传统架构 1 分布式架构 1 SOA架构 1 微服务架构 2 微服务架构产生的原因 2 漫谈微服务架构 2 什么是微服务 2 微服务架构特征 3 微服务架构如何拆分 3 微服务架构与SOA架构区别 3 SpringCloud微服务框架 3 为什么选择SpringCloud 4 SpringCloud简介 4 服务治理SpringCloud Eureka 5 什么是服务治理 5 服务注册与发现 5 搭建注册中心 6 常用注册中心框架 6 注册中心环境搭建 6 注册服务提供者 8 服务消费者 11 高可用注册中心 14 Eureka高可用原理 14 Eureka集群环境搭建 14 Eureka详解 17 使用Eureka闭源了闭源了怎么办? 21 使用Consul来替换Eureka 21 使用Zookeeper来替换Eureka 25 Consistency(一致性), 数据一致更新,所有数据变动都是同步的 Availability(可用性), 好的响应性能 Partition tolerance(分区容忍性) 可靠性 28 客户端负载均衡器 29 客户端负载均衡器 29 Ribbon与Nginx区别 29 RestTemplate 31 请求型 31 负载均衡器源码分析 33 负载均衡器重试机制 33 服务保护机制SpringCloud Hystrix 33 微服务高可用技术 33 服务降级、熔断、限流概念 34 服务学崩效应 34 服务降级 34 服务熔断 35 服务隔离 35 服务限流 36 Hystrix简单介绍 36 Hystrix环境搭建 37 Maven依赖信息 37 开启Hystrix断路器 37 服务降级处理 38 Hystrix仪表盘 39 Turbine集群监控 39 声明式服务调用SpringCloud Feign 39 feign介绍 39 环境搭建 40 Maven依赖信息 40 feign客户端接口 40 feign继承特性 41 创建springcloud-2.0-parent 42 Ribbon配置 45 配置Feign客户端超时时间 45 Api网关服务SrpingCloud Zuul 45 网关分 46 网关设计 46 网关框架 48 网关作用 49 网关与过滤器区别 49 Nginx与Zuul的区别 49 Zuul网关 49 动态网关 53 网关集群 55 分布式配置中心SrpingCloud config 57 SpringCloud分布式配置中心 57 Config架构 58 Git环境搭建 58 服务端详解 58 Maven依赖信息 58 application.yml配置 59 项目启动 60 客户端详解 60 Maven依赖信息 60 bootstrap.yml 61 读取配置文件 62 动态刷新数据 62 actuator端点刷新数据 63 Maven依赖信息 63 Bootstrap.xml新增 63 include: "*" 63 生效前提 63 private String itmayieduInfo; 63 当配置更改时,标有@RefreshScope的Bean将得到特殊处理来生效配置 64 手动刷新接口 64 分布式服务跟踪SpringCloud sleuth 64 什么是Sleuth 64 环境搭建 64 构建server-zipkin 64 会员服务 65 订单服务 65 Swagger2API接口管理 65 课题引入 65 传统的API文档编写存在以下几个痛点: 66 Swagger具有以下优点 66 Swagg er 2.0 集成配置 66 Maven依赖信息 66 SwaggerConfig 68 Zull整合Swagger管理微服务所有API 68 会员和订单引入Maven依赖 68 ZuulGateway网关 69
spring boot中文文档,从安装到部署。 I. Spring Boot文件 1.关于文档 2.获得帮助 3.第一步 4.使用Spring Boot 5.了解Spring Boot功能 6.转向生产 7.高级主题 II。入门 8.介绍Spring Boot 9.系统要求 9.1.Servlet容器 10.安装Spring Boot 10.1.Java Developer的安装说明 10.1.1.Maven安装 10.1.2.Gradle安装 10.2.安装Spring Boot CLI 10.2.1.手动安装 10.2.2.使用SDKMAN安装! 10.2.3.OSX Homebrew安装 10.2.4.MacPorts安装 10.2.5.命令行完成 10.2.6.Windows Scoop安装 10.2.7.快速启动Spring CLI示例 10.3.从早期版本的Spring Boot升级 11.开发您的第一个Spring Boot应用程序 11.1.创建POM 11.2.添加Classpath依赖项 11.3.编写代码 11.3.1.@RestController和@RequestMapping Annotations 11.3.2.@EnableAutoConfiguration注释 11.3.3.“主要”方法 11.4.运行示例 11.5.创建一个可执行的Jar 12.接下来要阅读的内容 III。使用Spring Boot 13.构建系统 13.1.依赖管理 13.2.Maven 13.2.1.继承Starter Parent 13.2.2.在没有父POM的情况下使用Spring Boot 13.2.3.使用Spring Boot Maven插件 13.3.Gradle 13.4.Ant 13.5.Starters 14.构建您的代码 14.1.使用“默认”包 14.2.找到主应用程序 15.配置 15.1.导入其他配置 15.2.导入XML配置 16.自动配置 16.1.逐步更换自动配置 16.2.禁用特定的自动配置 17. Spring Beans和依赖注入 18.使用@SpringBootApplication Annotation 19.运行您的应用程序 19.1.从IDE运行 19.2.作为打包应用程序运行 19.3.使用Maven插件 19.4.使用Gradle插件 19.5.热插拔 20.开发人员工具 20.1.Property默认值 20.2.自动重启 20.2.1.记录条件评估中的更改 20.2.2.不包括资源 20.2.3.观看其他路径 20.2.4.禁用重启 20.2.5.使用触发器文件 20.2.6.自定义重新启动加载器 20.2.7.已知限制 20.3.LiveReload 20.4.全局设置 20.5.远程应用 20.5.1.运行远程客户端应用程序 20.5.2.远程更新 21.包装您的生产
spring 的优点? 1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 5.容器提供了众多的辅助,能加快应用的开发 6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等 7.spring属于低侵入式设计,代码的污染极低 8.独立于各种应用服务器 9.spring的DI机制降低了业务对象替换的复杂性 10.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可以自由选择spring的部分或全部 什么是DI机制? 依赖注入(Dependecy Injection)和控制反转(Inversion of Control)是同一个概念,具体的讲:当某个角色 需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在spring中 创建被调用者的工作不再由调用者来完成,因此称为控制反转。创建被调用者的工作由spring来完成,然后注入调用者 因此也称为依赖注入。 spring以动态灵活的方式来管理对象 , 注入的两种方式,设置注入和构造注入。 设置注入的优点:直观,自然 构造注入的优点:可以在构造器中决定依赖关系的顺序。 什么是AOP? 面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring中主要表现为两个方面 1.面向切面编程提供声明式事务管理 2.spring支持用户自定义的切面 面向切面编程(aop)是对面向对象编程(oop)的补充, 面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。 AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象, 是对应用执行过程中的步骤进行抽象,,从而获得步骤之间的逻辑划分。 aop框架具有的两个特征: 1.各个步骤之间的良好隔离性 2.源代码无关性 Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session 8.关闭SesstionFactory 为什么要用: 1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。 4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。 2. Hibernate是如何延迟加载? 1. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection) 2. Hibernate3 提供了属性的延迟加载功能 当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。 3.Hibernate中怎样实现之间的关系?(如:一对多、多对多的关系) 之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、 4. 说下Hibernate的缓存机制 1. 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存 2. 二级缓存: a) 应用及缓存 b) 分布式缓存 条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非 关键数据 c) 第三方缓存的实现 5. Hibernate的查询方式 Sql、Criteria,object comptosition Hql: 1、 属性查询 2、 参数查询、命名参数查询 3、 关联查询 4、 分页查询 5、 统计函数 6. 如何优化Hibernate? 1.使用双向一对多关联,不使用单向一对多 2.灵活使用单向一对多关联 3.不用一对一,用多对一取代 4.配置对象缓存,不使用集合缓存 5.一对多集合使用Bag,多对多集合使用Set 6. 继承使用显式多态 7. 表字段要少,表关联不要
# springcloud-zone #### 项目介绍 项目为学习用途搭建,主要包括以下模块: springcloud-register:服务注册中心 (eureka-server),提供服务注册与发现功能。 springcloud-config:远程配置中心,分为git与native两个版本,为producer提供远程配置。 springcloud-connect:数据连接中心,包含DB、Redis、MQ、Mail等组件的配置入口,只需其他模块在pom中添加依赖并提供相关配置即可快速接入。 springcloud-producer:服务提供者,包含具体的业务逻辑实现等。 springcloud-consumer:服务消费者,从eureka server中获取producer提供的服务。 springcloud-gateway:网关接口,暴露给调用方调用,包含负载均衡、重试、熔断等功能。 springcloud-zipkin:链路跟踪工具,监控并就持久化微服务集群中调用链路的通畅情况,采用rabbitmq异步传输、elasticsearch负责持久化的方式集成。 #### 软件架构 1、JDK:jdk-8u181-windows-x64。 2、MAVEN:apache-maven-3.5.4 3、IDE:spring-tool-suite-3.9.3.RELEASE-e4.7.3-win32-x86_64 4、springboot:1.5.10.RELEASE。 5、springcloud:Edgware.SR2版本 #### 安装教程 需要提前安装如下程序: 1、ActiveMQ。 2、RabbitMQ。 3、Redis 4、Elasticsearch。 5、Elasticsearch-head。 6、MYSQL(执行springcloud-producer目录src/main/resources/templates/datasource.text中的建表语句) #### 使用说明 项目运行顺序: 1、 springcloud-register, 2、 springcloud-config-native或者springcloud-config-git: 启动git远程配置中心需要修改springcloud-producer项目的bootstrap.yml配置文件,并将配置配件上传到git上。 3、springcloud-zipkin。 4、 springcloud-producer。 5、springcloud-consumer。 6、springcloud-gateway. 注: 在测试gateway负载均衡时可以启动单个项目的多个实例,具体方式如下: 1、项目启动右键run as->run configurations..,打开配置框。 2、java application右键new,打开新建窗口。 3、顶部tab选中Main,在name中填写启动名称,project中填写项目名称,main class中填写启动详细路径+名。 4、顶部tab选中Arguments,在VM arguments中填写-Dserver.port=端口号,比如-Dserver.port=8080 5、点击run即可以配置的端口号启动多个项目实例了。 #### 参与贡献 ningchongqing

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值