@SpringBootApplication注解的理解——如何排除自动装配 & 分布式情况下如何自动加载 & nacos是怎么被发现的

前言

spring作为主流的 Java Web 开发的开源框架,是Java 世界最为成功的框架,持续不断深入认识spring框架是Java程序员不变的追求。

本篇博客介绍SpringBootApplicant注解的自动加载相关内容

其他相关的Spring博客文章列表如下:

Spring基础(核心容器)——从配置文件到注解开发 & 创建对象+成员变量赋值IOC & 增强方法AOP

在这里插入图片描述
Spring进阶(AOP的理解)——静态/动态代理 & 面向切面编程AOP(Aspect Oriented Programming) & 日志记录 & 增强方法

在这里插入图片描述

Spring进阶(AOP的应用)—— 动态代理AOP后controller层的private方法访问失效的问题

在这里插入图片描述

Spring基础(Web-MVC)——在idea中新建springWeb项目 & 浏览器请求 和 服务器响应 & SpringMvc文件相关

在这里插入图片描述
SpringMvc框架——【深入】SpringMVC 的运行流程:从客户端发送请求request到springMvc框架返回响应response的全流程分析 & DispatcherServlet

在这里插入图片描述

SpringBoot基础——追根溯源servlet是啥,tomcat是啥,maven是啥 & springBoot项目初步,maven构建,打包 & 测试

在这里插入图片描述

目录

  • 前言
  • 引出
  • mybatis相关包导入没写配置
    • 1.@SpringBootApplication注解
    • 2.如果没有写url等相关配置
  • 分布式架构下如何加载其他模块的类
    • 1.单体架构的一般模式
    • 2.分布式架构的模式
      • 另一种方式:设置自动装配
    • 问题:使用nacos的时候怎么发现的?
  • 总结

引出


1.mybatis相关包导入没写配置,@SpringBootApplication注解加入排除自动装配的相关内容;
2.在分布式架构下,如果某个模块想要其他模块下的类,需要加入@ComponentScan(basePackages = “com.tianju.domain”)进行包的扫描;
3.如果不加包扫描的注解,则需要在想要被注入到spring容器中的模块的resource下,即根目录下新建文件夹META-INF,新建文件spring.factories,写相关内容;

mybatis相关包导入没写配置

1.@SpringBootApplication注解

在这里插入图片描述

2.如果没有写url等相关配置

导入了mysql,mybatis,druid的依赖,但是application.yml文件中没有写相关的数据源url等的配置

在这里插入图片描述

此时,需要在注解@SpringBootApplication中加入排除自动装配的相关内容;加入排除后,再次启动项目,不再报错。

在这里插入图片描述

package com.tianju;

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;

@SpringBootApplication(exclude =
        {DruidDataSourceAutoConfigure.class,
        DataSourceAutoConfiguration.class}
)
public class TestApp {
    public static void main(String[] args) {
        SpringApplication.run(TestApp.class);
    }
}

分布式架构下如何加载其他模块的类

在这里插入图片描述

mybatisplus使用分页插件,拦截器策略,在在一个引入位置写拦截器,其它模块引入配置类,需要使用@ComponentScan(base="配置类所在的包)

1.单体架构的一般模式

在这里插入图片描述

package com.tinaju.bm.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 分页需要加一个拦截器
 */
@Configuration
public class MybatisPlusConfig {

    @Bean // 放到容器中
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        paginationInnerInterceptor.setDbType(DbType.MYSQL);
        paginationInnerInterceptor.setOverflow(true);
        mybatisPlusInterceptor.addInnerInterceptor(paginationInnerInterceptor);
        return mybatisPlusInterceptor;
    }
}

在单体模式下,会自动扫描主启动类同级下面的注解,就扫描到了标了注解的@Configuration 的分页拦截器

在这里插入图片描述

2.分布式架构的模式

在分布式架构下,如果某个模块想要其他模块下的类,需要加入@ComponentScan(basePackages = “com.tianju.domain”)进行包的扫描

在这里插入图片描述

package com.tianju.smovie.genre;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@SpringBootApplication
@EnableDiscoveryClient
//@EnableJpaRepositories // 不加会报错 Not a managed type: class com.tianju.domain.entity.Genre
@EntityScan(basePackages = "com.tianju.domain.entity") // TODO:jpa需要加这个
@ComponentScan(basePackages = "com.tianju.domain")
public class GenreApp {
    public static void main(String[] args) {
        SpringApplication.run(GenreApp.class);
    }
}

如果不加的话,就不会加载到容器中

在这里插入图片描述

另一种方式:设置自动装配

如果不加上面包扫描的注解,则需要在想要被注入到spring容器中的模块的resource下,即根目录下新建文件夹META-INF,新建文件spring.factories,写相关内容。

在这里插入图片描述

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.tianju.domain.config.MybatisPlusConfig

在这里插入图片描述

排除在外相关

在这里插入图片描述

问题:使用nacos的时候怎么发现的?

如下图所示,nacos里面就有文件夹META-INF,下面有个文件spring.factories,里面的东西就会被加载进来

在这里插入图片描述

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration,\
  com.alibaba.cloud.nacos.endpoint.NacosDiscoveryEndpointAutoConfiguration,\
  com.alibaba.cloud.nacos.registry.NacosServiceRegistryAutoConfiguration,\
  com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientConfiguration,\
  com.alibaba.cloud.nacos.discovery.reactive.NacosReactiveDiscoveryClientConfiguration,\
  com.alibaba.cloud.nacos.discovery.configclient.NacosConfigServerAutoConfiguration,\
  com.alibaba.cloud.nacos.loadbalancer.LoadBalancerNacosAutoConfiguration,\
  com.alibaba.cloud.nacos.NacosServiceAutoConfiguration,\
  com.alibaba.cloud.nacos.util.UtilIPv6AutoConfiguration
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
  com.alibaba.cloud.nacos.discovery.configclient.NacosDiscoveryClientConfigServiceBootstrapConfiguration
org.springframework.boot.SpringApplicationRunListener=\
  com.alibaba.cloud.nacos.logging.NacosLoggingAppRunListener

总结

1.mybatis相关包导入没写配置,@SpringBootApplication注解加入排除自动装配的相关内容;
2.在分布式架构下,如果某个模块想要其他模块下的类,需要加入@ComponentScan(basePackages = “com.tianju.domain”)进行包的扫描;
3.如果不加包扫描的注解,则需要在想要被注入到spring容器中的模块的resource下,即根目录下新建文件夹META-INF,新建文件spring.factories,写相关内容;文章来源地址https://uudwc.com/A/Mxq8J

原文地址:https://blog.csdn.net/Pireley/article/details/133383051

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

h
上一篇 2023年10月09日 08:16
Seata 基于改良版雪花算法的分布式 UUID 生成器分析
下一篇 2023年10月09日 09:16