日常知识点记录

1、Maven 中的dependencyManagement和dependency的区别

首先maven可以通过子模块依赖父模块的方式获得父模块的所有依赖,极大便利的提供了对项目以来的管理,但是在使用这种方式实现对依赖的管理时,子模块不可避免的会引入父模块中存在,但是对自身来说并不需要的依赖,导致引入了冗余的jar包,但使用dependencyManagement 则可以有效避免这个问题。dependencyManagement 具有一下两个特性:

1、在该元素下声明的依赖不会引入到模块中只有在dependeny中同样声明了该依赖,才会引入到模块中

2、该元素能够约束dependency 下依赖的使用,如果在dependency 中未指定版本,则会使用dependencyManagement 的版本,否则就会覆盖dependencyManagement 指定的版本。

2、@Import使用

@Import 注解提供了类似 @Bean 注解的功能,向Spring容器中注入bean

从定义上来看,@Import注解非常简单,只有一个属性value(),类型为类对象数组,如value={A.class, B.class},这样就可以把类A和B交给Spring容器管理。但是这个类对象需要细分为三种对象,也对应着@Import的三种用法如下:

  • 普通类
  • 实现了ImportSelector接口的类(这是重点~Spring Boot的自动配置原理就用到这种方式)
  • 实现了ImportBeanDefinitionRegistrar接口的类

        普通类

  • @Configuration
    @Import({Student.class})
    public class MyConfig {
    ​
        @Bean
        public Person person01() {
            Person person = Person.builder().id(1l).name("shepherd").age(25).build();
            return person;
        }
    ​
    ​
        public static void main(String[] args) {
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfig.class);
            String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
            // 遍历Spring容器中的beanName
            for (String beanDefinitionName : beanDefinitionNames) {
                System.out.println(beanDefinitionName);
            }
        }
    ​
    }
    ​
    myConfig
    com.shepherd.common.config.Student
    person01

这里默认注入了一些Spring内部bean和我们在MyConfig中注入的bean,@Import({Student.class})Student类注入到了Spring容器中,beanName默认为全限定类名com.shepherd.common.config.Student,而@Bean注入的默认为方法名,这也是两者的区别。

实现了ImportSelector接口的类

@Import最常用的方式,Spring Boot的自动装配原理就用到了这种方式

ImportSelector接口

  • selectImports( )返回一个包含了类全限定名的数组,这些类会注入到Spring容器当中。注意如果为null,要返回空数组,不然后续处理会报错空指针
  • getExclusionFilter()该方法制定了一个对类全限定名的排除规则来过滤一些候选的导入类,默认不排除过滤。该接口可以不实现
public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"com.shepherd.common.config.Student",
        "com.shepherd.common.config.Person"};
    }
}
@Configuration
@Import({MyImportSelector.class})
public class MyConfig {
​
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfig.class);
        String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
        // 遍历Spring容器中的beanName
        for (String beanDefinitionName : beanDefinitionNames) {
            System.out.println(beanDefinitionName);
        }
    }
}

Spring没有把MyImportSelector当初一个普通类进行处理,而是根据selectImports( )返回的全限定类名数组批量注入到Spring容器中。当然你也可以实现重写getExclusionFilter()方法排除某些类,比如你不想注入Person类,你就可以通过这种方式操作一下即可

实现ImportBeanDefinitionRegistrar接口的类

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
​
​
    //使用 BeanNameGenerator自动生成beanName
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {
        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(Person.class);
        AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();
        String beanName = importBeanNameGenerator.generateBeanName(beanDefinition, registry);
        registry.registerBeanDefinition(beanName, beanDefinition);
    }
​
    // 手动指定beanName
//    @Override
//    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
//        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(Student.class);
//        AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();
//        registry.registerBeanDefinition("student001", beanDefinition);
//    }
​
}

里只能注入一个bean,所以只能实现一个方法进行注入,如果两个都是实现,前面的一个方法生效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/277039.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端性能优化 将资源放到 linux 服务器上 提升访问效率

我们先远端连接服务器 然后服务器终端输入 mkdir 目录路径建出一个新的文件路径 回到我们自己的电脑 然后 在要缓存到服务器的文件目录下打开终端 输入 scp -r ./xidis.hdr 用户名 如果没设置用户名就是root服务器公网IP:/root/xhdr例如 scp -r ./xidis.hdr root1.113.266…

SpringBoot+AOP+Redis 防止重复请求提交

本文项目基于以下教程的代码版本&#xff1a; https://javaxbfs.blog.csdn.net/article/details/135224261 代码仓库: springboot一些案例的整合_1: springboot一些案例的整合 1、实现步骤 2.引入依赖 我们需要redis、aop的依赖。 <dependency><groupId>org.spr…

Docker - 镜像 | 容器 | 数据卷 日常开发常用指令 + 演示(一文通关)

目录 Docker 开发常用指令汇总 辅助命令 docker version docker info docker --help 镜像命令 查看镜像信息 下载镜像 搜索镜像 删除镜像 容器命令 查看运行中的容器 运行容器 停止、启动、重启、暂停、恢复容器 杀死容器 删除容器 查看容器日志 进入容器内部…

记一次修复外网无法访问vmware里面的虚拟机的网络端口的问题

发现一个奇怪的网络问题&#xff0c;vmware里一个程序的端口通过vmnat穿透出来&#xff0c;然后这个端口就能够通过局域网被其他机器访问&#xff0c;但是另一个网段就没法访问这个端口。使用主机上的其他程序使用开启同样的端口&#xff0c;另一个网段的机器却可以访问。我想不…

idea 如何快速拉取新分支

方式1 &#xff08;快捷键&#xff1a;CtrlShift~&#xff09; 方式2:&#xff08;快捷键&#xff1a;Alt9&#xff09;

java Servlet 汽车保养服务平台系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Servlet 汽车保养服务平台系统是一套完善的java web信息管理系统&#xff0c;采用serlvetdaobean mvc模式开发&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数 据库&#xff0c;系统主要采用B/S模式开发。开发环境为…

Linux系统下隧道代理HTTP

在Linux系统下配置隧道代理HTTP是一个涉及网络技术的话题&#xff0c;主要目的是在客户端和服务器之间建立一个安全的通信通道。下面将详细解释如何进行配置。 一、了解基本概念 在开始之前&#xff0c;需要了解几个关键概念&#xff1a;代理服务器、隧道代理和HTTP协议。代理…

一文带你掌握Flutter dio网络请求库的封装

highlight: an-old-hope 封装网络库考虑的几个方面&#xff1a; 请求参数的封装&#xff1a; 将请求所需的参数进行封装&#xff0c;例如 URL、请求头、请求体等。可以定义一个统一的数据结构或模型类来表示请求参数&#xff0c;以便于传递和管理。 响应结果的封装&#xff…

ChatGPT使用注意事项有哪些?

一、环境注意事项 1、需要构造稳定的环境&#xff0c;很多人说自己的号为什么突然被封&#xff0c;被封的原因是因为有些环境会自动换IP&#xff0c;所以你要设置好 2、搭建美国住宅IP 3、注册时也不要使用香港&#xff0c;最好选择美国、新加坡等地区注册 二、API调用注意事…

【Java EE初阶四】锁及synchronized关键字

1. 加锁的目的 对于count这样的一个java语句&#xff0c;其底层是由三个基本操作组成的&#xff0c;我们在多线程中运行一个java语句&#xff0c;但是该语句的三个操作会被其他线程冲散&#xff0c;导致整个Java语句不能及时的一次性完成&#xff0c;这样就会导致我们的预期结果…

【WordPress插件】热门关键词推荐v1.3.0 Pro开心版

介绍&#xff1a; WordPress插件-WBOLT热门关键词推荐插件&#xff08;Smart Keywords Tool&#xff09;是一款集即时关键词推荐、关键词选词工具及文章智能标签功能于一体的WordPress网站SEO优化插件。 智能推荐&#xff1a; 热门关键词推荐引擎-支持360搜索、Bing、谷歌&a…

极智开发 | 解读英伟达软件生态 深度神经网络库cuDNN

欢迎关注,获取我的更多经验分享 大家好,我是极智视界,本文来介绍一下 解读英伟达软件生态 深度神经网络库cuDNN。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:https://t.zsxq.com/0aiNxERDq cuDNN,全称为 NVIDIA CUDA Deep Neural Net…

3D动态路障生成

3D动态路障生成 介绍设计实现1.路面创建2.空物体的创建3.Create.cs脚本创建 总结 介绍 上一篇文章介绍了Mathf.Lerp的底层实现原理&#xff0c;这里介绍一下跑酷类游戏的动态路障生成是如何实现的。 动态路障其实比较好生成&#xff0c;但是难点在哪里&#xff0c;如果都是平面…

RHCE9学习指南 第11章 网络配置

11.1 网络基础知识 一台主机需要配置必要的网络信息&#xff0c;才可以连接到互联网。需要的配置网络信息包括IP&#xff0c;子网掩码&#xff0c;网关和DNS。 11.1.1 IP地址 在计算机中对IP的标记使用的是32bit的二进制&#xff0c;例如&#xff0c; 11000000 10101000 00…

基于梯度和频率域的深度超分辨率新方法笔记二

一、实现方法和网络结构的剖析 1.1 网络结构 梯度校准模块(GCM)和频率感知模块&#xff08;FAM&#xff09; 1&#xff09;梯度校准模块(GCM) 1、使用梯度映射函数&#xff08;如下图所示&#xff09;&#xff0c;将RGB和LR深度图映射到梯度域 2、再梯度域中使用RGB的梯度特…

【 C语言 】 | C程序百例

【 C语言 】 | C程序百例 时间&#xff1a;2023年12月28日13:50:43 文章目录 【 C语言 】 | C程序百例1.参考2.练习 1.参考 1.【 C语言 】 | C程序百例-CSDN博客 2.100Example: C程序百例-酷勤网&#xff08;kuqin.com&#xff09;提供.pdf (gitee.com) 3.cProgram/LinuxC - 码…

IPD-PDP产品开发流程-PDT产品开发计划Charter文档模板(word)2

书接上回&#xff0c;继续为大家分享PDT的产品开发计划Charter模板的主要内容。 据华研荟了解&#xff0c;大部分国内的企业在推行IPD的时候就直接像华为一样&#xff0c;把开发计划&#xff08;任务书&#xff09;叫做Charter&#xff0c;而不翻译为中文。其实这也是一种很好…

高校怎么搭建虚拟数字人动作捕捉实训室?

如今&#xff0c;虚拟数字人市场迎来爆发风口&#xff0c;在产业推动下&#xff0c;虚拟数字人动作捕捉技术人才需求旺盛&#xff0c;高校搭建虚拟数字人动作捕捉实训室&#xff0c;可以让学生接触前沿的全身动作捕捉系统&#xff0c;能够培养具有开阔眼界和先进技术接轨的专业…

鸿蒙系列--组件介绍之其他基础组件(上)

上回介绍了基础组件中最常用的组件常用的基础组件&#xff0c;接下来还有其他基础组件 一、Blank 描述&#xff1a;空白填充组件 功能&#xff1a;在容器主轴方向上&#xff0c;具有自动填充容器空余部分的能力。只有当父组件为Row/Column时生效 子组件&#xff1a;无 Blan…

羊大师讲解,羊奶在本草纲目中的作用及其益处

羊大师讲解&#xff0c;羊奶在本草纲目中的作用及其益处 羊奶是一种传统的中药材&#xff0c;早在《本草纲目》中就被广泛记录和应用。它是从母羊妊娠后分泌出来的乳汁&#xff0c;具有丰富的营养成分和独特的药用价值。小编羊大师发现&#xff0c;羊奶被认为是一种滋补养颜、…