Spring framework Day15:@lmport注解使用

news2024/12/1 0:41:53

前言

在编程中,@import注解通常用于导入外部的类、接口或其他资源,以便在当前代码文件中使用。它可以提供一种简洁、方便的方式来引入外部依赖,并且有以下几个主要的应用场景和好处:

  1. 引入外部类/接口:使用@import注解可以将其他模块或库中的类/接口引入到当前的代码文件中,使得我们可以直接使用这些类/接口,而无需手动编写完整的类名。这样可以减少代码中的冗余,提高可读性和编码效率。

  2. 静态方法/常量引入:通过@import注解还可以引入外部类中的静态方法和常量,使得我们可以直接在当前代码文件中调用这些静态方法或使用常量,而无需每次都使用完整的类名进行访问。这样不仅简化了代码书写,还提高了代码的可读性。

  3. 展示注解@import注解也可以用于展示某个特定的注解,以便在当前代码文件中使用这个注解。这在一些特定的编程框架和库中非常常见,例如在使用 Spring 框架时,我们可以使用@import注解来导入其他配置类,从而实现依赖注入等功能。

总结来说,@import注解提供了一种便捷的方式来引入外部的类、接口、静态方法和常量,以及展示注解。它简化了代码书写、提高了可读性和编码效率,并且在一些特定的框架和库中具有特殊的用途。

一、开始学习

1、新建项目,结构如下

2、添加 spring 依赖 
 
    <!-- spring 的核心依赖 -->
    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.23</version>
        </dependency>
 
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.4.5</version>
        </dependency>
 
    </dependencies>
3、在 anno 包下新建一个 MyAnno 注解类
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno {

}

这段代码定义了一个名为MyAnno的注解。让我们一步步解析这段代码的含义:

  1. @Target(ElementType.TYPE):这行代码使用@Target注解来指定了注解的作用目标。在这里,指定的目标是ElementType.TYPE,表示该注解可以应用于类、接口(包括注解类型)或枚举类型。

  2. @Retention(RetentionPolicy.RUNTIME):这行代码使用@Retention注解来指定了注解的生命周期。在这里,指定的生命周期是RetentionPolicy.RUNTIME,表示该注解在运行时仍然可用,即可以通过反射等方式获取到该注解的信息。

  3. public @interface MyAnno:这行代码定义了一个注解类型MyAnno。通过在类上使用@interface关键字,将一个普通的接口声明为一个注解类型。

综上所述,这段代码定义了一个运行时可见的注解MyAnno,并且可以应用于类、接口或枚举类型。你可以使用这个注解来修饰类、接口或枚举类型,然后在运行时通过反射等方式获取到被注解元素的相关信息。

4、在 controller 包下新建一个 UserController 类
@Slf4j
@MyAnno
public class UserController {

    public void add(){
        log.info("添加用户");
    }

}

这段代码为UserController类添加了@MyAnno注解和@Slf4j注解。让我们一步步解析这段代码的含义:

  1. @MyAnno:这个注解用来修饰UserController类,表示该类被注解为MyAnno类型。由于我们在MyAnno注解中指定了作用目标为类、接口或枚举类型,所以这个注解可以应用于类。

  2. @Slf4j:这个注解是 Lombok 库提供的一个注解,用来自动生成日志记录器变量log(即private static final Logger log = LoggerFactory.getLogger(UserController.class);),避免了手动编写日志记录器的繁琐过程。

  3. public class UserController:这是一个普通的 Java 类定义,表示一个名为UserController的类。

  4. public void add():这是一个方法定义,表示UserController类中的一个名为add的公共实例方法。该方法使用了@Slf4j注解生成的log变量,用来记录日志信息。

综上所述,这段代码为UserController类添加了@MyAnno注解和@Slf4j注解,并且定义了一个名为add的公共实例方法,在该方法中调用了自动生成的日志记录器变量log记录日志信息。

5、在 config 包下新建 Annoimportlector 配置类
/**
 * @Date 2023-10-08
 * @Author qiu
 * 自定义导入选择器,如果类上标注了 @MyAnno 的注解,
 * 就将其纳入 Spring 容器中管理
 */
public class AnnoimportSelector implements ImportSelector {

    /**
     *
     * @param importingClassMetadata
     * @return 所有需要导入类的完整类名
     */
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        // 创建一个集合保存带有注解的类的完整类名
        ArrayList<String> classNameList = new ArrayList<>();
        // 解析类上是否存在 @MyAnno注解
        if (UserController.class.isAnnotationPresent(MyAnno.class)){
            classNameList.add(UserController.class.getName());
        }
        return StringUtils.toStringArray(classNameList);
    }
}

这段代码定义了一个名为AnnoimportSelector的类,实现了ImportSelector接口。让我们一步步解析这段代码的含义:

  1. public class AnnoimportSelector implements ImportSelector:这是一个类定义,表示一个名为AnnoimportSelector的类,实现了ImportSelector接口。

  2. @Override:这个注解表示该方法是对父类或接口中同名方法的重写。

  3. public String[] selectImports(AnnotationMetadata importingClassMetadata):这是一个方法定义,实现了ImportSelector接口中的selectImports方法。该方法的作用是根据指定的条件选择需要导入的类,并以完整类名的形式返回。

  4. ArrayList<String> classNameList = new ArrayList<>();:这行代码创建了一个ArrayList集合,用于保存带有@MyAnno注解的类的完整类名。

  5. if (UserController.class.isAnnotationPresent(MyAnno.class)):这行代码判断UserController类是否存在@MyAnno注解。如果存在,则将UserController类的完整类名添加到classNameList集合中。

  6. return StringUtils.toStringArray(classNameList);:这行代码将classNameList集合转换为字符串数组,并作为selectImports方法的返回值。

综上所述,这段代码定义了一个自定义的导入选择器AnnoimportSelector,用于根据条件选择需要导入的类。在该选择器中,如果某个类标注了@MyAnno注解,则将其纳入Spring容器中进行管理。

 6、在 config 包下新建一个 AppConfig 配置类

不使用 @Import 注解实现调用 UserService 的方法

@Configuration
public class AppConfig {

    @Bean
    public UserController userController(){
        return  new UserController();
    }

}

在该配置类中使用@Bean注解定义了一个名为userController的Bean,该Bean是UserController类的实例。通过这种方式,我们告诉Spring容器在启动时创建并管理这个UserController的实例,从而可以在其他地方通过依赖注入的方式使用它。

7、测试
public class Main {

    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        UserController bean = context.getBean(UserController.class);
        bean.add();
    }

}

 运行结果

二、使用 @Import 注解

1、 使用 @Import 注解导入(装配)普通的 bean

更改 AppConfig 配置类

@Configuration
@Import(UserController.class)
public class AppConfig {


}

 在该配置类中使用@Import注解将UserController类导入到该配置类中进行管理。通过这种方式,我们告诉Spring容器在启动时创建并管理这个UserController的实例,从而可以在其他地方通过依赖注入的方式使用它。

1)、测试
public class Main {

    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        UserController bean = context.getBean(UserController.class);
        bean.add();
    }

}

 运行结果

2、使用 @Import 注解导入其他的配置类(常用)
1)在 config 包下新建 MvcConfig、MybatisConfig 配置类

MvcConfig 配置类

@Configuration
public class MvcConfig {
}

 MybatisConfig 配置类

@Configuration
public class MybatisConfig {
}
2)更改 AppConfig 配置类 
@Configuration
@Import({MvcConfig.class,MybatisConfig.class,UserController.class})
public class AppConfig {


}

 在该配置类中使用@Import注解将MvcConfigMybatisConfigUserController三个类导入到该配置类中进行管理。通过这种方式,我们告诉Spring容器在启动时创建并管理这些类的实例,从而可以在其他地方通过依赖注入的方式使用它们。这个配置类可以用于配置Spring MVC框架、MyBatis框架以及UserController类等相关的Bean。

 3)、测试
public class Main {

    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        UserController bean = context.getBean(UserController.class);
        bean.add();
    }

}

 运行结果

3、 使用 @Import 注解实现选择性导入(即按照指定的逻辑来导入相关的类)

要实现选择性导入,可以使用@Import注解配合Condition接口来定义逻辑。

首先,创建一个实现Condition接口的自定义条件类,例如MyCondition

public class MyCondition implements Condition {
 
@Override 
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { 
// 在这里编写自定义的逻辑判断条件
 // 返回true表示满足条件,需要导入相关类;返回false表示不满足条件,不导入相关类
 // 可根据实际需求进行逻辑的判断与处理 return true; 
} }

然后,在@Import注解中使用自定义条件类:

@Configuration
@Import(value = {MvcConfig.class, UserController.class, MyConfiguration.class}) 
public class AppConfig { 
// ... 
}

在上述代码中,我们将MvcConfigUserControllerMyConfiguration类作为参数传递给@Import注解。对于需要选择性导入的类,可以根据自定义的条件类来决定是否导入。

最后,将自定义条件类注册到Spring容器中:

@Configuration 
public class MyConfiguration { 
@Bean 
public MyCondition myCondition() {
 return new MyCondition(); 
} 
}

这样,当MyCondition条件满足时,相关类会被导入到AppConfig配置类中进行管理,否则不会被导入。通过编写自定义的条件类,我们可以根据实际需求灵活地实现选择性导入。

三、使用 @Import 的好处

使用@Import注解的好处包括:

  1. 简化配置:通过@Import注解,可以将多个类一次性导入到配置类中进行管理,避免了在配置类中逐个声明依赖的繁琐过程,使得配置更加简洁、清晰。

  2. 组织代码结构:@Import注解可以帮助将相关的类组织在一起,提高代码的可读性和可维护性。通过将相关的类一起导入到配置类中,可以更好地表示它们之间的关联。

  3. 提供依赖注入支持:导入的类会交给Spring容器进行管理,可以通过依赖注入的方式在应用程序的其他地方使用。这样可以方便地使用这些类的实例,而无需手动创建和管理它们。

  4. 可选择性导入:@Import注解可以与自定义条件类(实现Condition接口)结合使用,根据特定的条件来决定是否导入相关的类。这种灵活性可以根据实际需求进行选择性导入,提高系统的可配置性和扩展性。

  5. 模块化开发:@Import注解可以帮助将不同模块的配置类组合在一起,实现模块化开发。通过导入其他模块的配置类,可以在一个配置类中同时配置多个模块,提供更好的代码组织和模块可复用性。

总之,@Import注解是一个强大的工具,可以简化配置、提供依赖注入支持,并且具有选择性导入和模块化开发的优势。它使得应用程序的配置更加灵活、简洁和可读,提高开发效率和代码质量。

四、总结

 本章节主要讲了 @Import 注解的三种使用:

  1、使用 @Import 注解导入(装配)普通的 bean
  例如:@Import(UserController.class)
 
 2、使用 @Import 注解导入其他的配置类(常用)
  例如:在项目中可以模块化配置类,包括 MVC 的配置类
  mybatis 配置类,Redis 配置类、Rabbit MQ 配置类等等,
  那么可以在一个总配置类中导入其他这些配置类进行合并,
  这样维护性扩展性更强
 例如:@Import({MvcConfig.class,MybatisConfig.class})
 
 3、使用 @Import 注解实现选择性导入(即按照指定的逻辑来导入相关的类)
 这种方式需要自定义一个导入选择器交给 spring 执行

五、gitee 案例

案例完整地址:https://gitee.com/qiu-feng1/spring-framework.git

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年最受好评的五款项目计划工具排名揭晓!

近年来&#xff0c;项目计划工具已经成为项目管理中不可或缺的一部分。正确的项目计划工具将帮助您更有效地管理项目&#xff0c;从而改善结果。随着技术的进步&#xff0c;现在有许多强大而通用的项目计划工具可用。展望2023年&#xff0c;以下是你应该考虑的深受好评的五款项…

如何在Linux上安装Tomcat

安装Tomcat的前提是安装好JDK 使用yum安装JDK Liunx的包管理器就如同手机上的应用商城一样&#xff0c;可以在其中下载软件 Linux中的包管理器有很多&#xff1a;yum、apt、pacman...其中yum是centos自带的包管理器 获取与jdk有关的数据包 请注意&#xff1a;i686后缀的为32位操…

DarkGate恶意软件通过消息服务传播

导语 近日&#xff0c;一种名为DarkGate的恶意软件通过消息服务平台如Skype和Microsoft Teams进行传播。它冒充PDF文件&#xff0c;利用用户的好奇心诱使其打开&#xff0c;进而下载并执行恶意代码。这种攻击手段使用了Visual Basic for Applications&#xff08;VBA&#xff0…

总结10.15

项目进展 登陆注册&#xff0c;连接了数据库&#xff0c;找回密码写到了通过给邮箱发送验证码&#xff0c;然后重新输入密码 项目看法 之后俩天加紧把这个登陆注册这些搞完&#xff0c;注册用到的随机生成一个账号且不重复&#xff0c;且设置一个邮箱作为之后找回密码时候的…

realman——基于SDK的pick_and_place

文章目录 概要手眼标定外参发布采摘流程核心代码设定初始位置设定安放位置坐标变换单次采摘和安放预采摘点的计算预采摘点和采摘点的运动控制参考概要 这篇博客主要介绍用官方SDK来实现睿尔曼机械臂的运动控制(从采摘到安放),对于如何获取采摘点的三维坐标不做描述。 PS:m…

Vue-3.3ESLint

ESLint代码规范 代码规范&#xff1a;一套写代码的约定规则。 JavaScript Standard Style规范说明https://standardjs.com/rules-zhcn.html 代码规范错误 如果你的代码不符合standard的要求&#xff0c;ESlint会跳出来提醒。 比如&#xff1a;在mian.js中随意做一些改动&a…

【AI视野·今日Sound 声学论文速览 第二十三期】Wed, 11 Oct 2023

AI视野今日CS.Sound 声学论文速览 Wed, 11 Oct 2023 Totally 14 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers AutoCycle-VC: Towards Bottleneck-Independent Zero-Shot Cross-Lingual Voice Conversion Authors Haeyun Choi, Jio Gim, Yuho Lee, Y…

【mysql】Mysql自定义变量 @rownum使用

Mysql自定义变量 rownum 这个可以赋值&#xff1f;这是初始化&#xff1f; 先看表结构 有五条数据。执行前半段语句发现。rownum的起始值等于行数 这里from后面可以加person与 r这连个组成 如果这里的rownum打错了呢。发现这个变量就没有初始值。 可见&#xff0c;没有必要…

C++指针解读(6)-- 指针和字符串

1、字符串的基本概念 &#xff08;1&#xff09;字符串的存储 字符串是存放在字符数组中的。比如字符串“hello”&#xff0c;在内存中是这么存放的&#xff1a; 这里要注意&#xff0c;在字符串的最后会加上一个\0&#xff0c;也被称为NUL字符&#xff0c;表示字符串的结束位…

【算法训练-排序算法 三】【排序应用】合并区间

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【合并区间】&#xff0c;使用【数组】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…

闪电藤文件传输助手上线

官网 临时官网&#xff1a;https://lightningvine.zishu.life/ 正式官网&#xff08;备案中&#xff09;&#xff1a;lightningvine.cn 简介 闪电藤是基于LocalSend二次开发的一款局域网文件传输工具&#xff0c;完全兼容LocalSend&#xff0c;在它的基础上进行UI交互的重新设计…

前端取消请求

取消请求 发送一个异步请求获取数据&#xff0c;并在控制台中打印出返回结果。这里使用了 fetch 方法来发送请求&#xff0c;同时使用 AbortController 对象来实现请求的取消操作。 具体来说&#xff0c;代码中定义了一个 list 函数&#xff0c;该函数会创建一个 AbortContro…

在 VSCode 中使用 PlantUML

最近&#xff0c;因为工作需要绘制一些逻辑图&#xff0c;我自己现在使用的是 PlantUML 或者 mermaid&#xff0c;相比之下前者更加强大。不过它的环境也麻烦一些&#xff0c;mermaid 在一些软件上已经内置了。但是 PlantUML 一般需要自己本地安装或者使用远程服务器&#xff0…

计算机毕业设计-开题报告答辩常见问题!Javaweb项目答辩

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

2023年厦门市高等职业院校技能竞赛软件测试竞赛规程

2023年厦门市高等职业院校技能竞赛 软件测试竞赛规程 一、赛项名称 赛项名称&#xff1a;软件测试 竞赛形式&#xff1a;团体赛 赛项专业大类&#xff1a;电子信息 二、竞赛目的 &#xff08;一&#xff09;检验教学成效 本赛项竞赛内容以《国家职业教育改革实施方案》为设计方…

Java Swing医院就诊预约系统

一、系统概述 本系统是一款使用Java Swing开发的医院就诊预约系统,面向医院的医务人员和患者使用。 系统功能: 患者管理:添加/编辑/查询/删除患者信息 医生管理:添加/编辑/查询/删除医生信息 科室管理:添加/编辑/查询/删除科室信息 预约登记:患者选择医生和日期进行预约 预约…

【文档智能】多模态预训练模型及相关数据集汇总

前言 大模型时代&#xff0c;在现实场景中或者企业私域数据中&#xff0c;大多数数据都以文档的形式存在&#xff0c;如何更好的解析获取文档数据显得尤为重要。文档智能也从以前的目标检测&#xff08;版面分析&#xff09;阶段转向多模态预训练阶段&#xff0c;本文将介绍目…

分享项目管理软件排行榜!

无论是大型企业还是小型团队&#xff0c;项目管理是企业不可或缺的一部分。一个好的项目管理软件可以帮助企业有效地规划和实施项目&#xff0c;对于团队成员来说&#xff0c;也可以更好地分配任务、查看进度和提高团队合作能力。面对众多的项目管理软件&#xff0c;如何选择适…

JMM模型与并发三大特性

如何学&#xff1a; 分理解并发的三大特性&#xff0c;JMM工作内存和主内存关系&#xff0c;知道多线程之间如何通信的&#xff0c;掌握volatile能保证可见性和有序性&#xff0c;CAS就可以了 并发和并行 目标都是最大化CPU的使用率 并行(parallel)&#xff1a;指在同一时刻&a…

Arcgis对图像重采样、打开查看运行结果的窗口、逐像元提取数值

1、Arcgis对图像重采样 然后打开数据管理工具-栅格-栅格处理-重采样 打开后&#xff0c;此处我们输入数据用导入的影像&#xff0c;X和Y代表重采样的大小为8*8 注意&#xff1a;输出文件需要有文件后缀&#xff0c;否则报错。 采样后&#xff0c;像元就变成了8*8一个像元。 2…