我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何用Java注解和反射实现依赖注入

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何用Java注解和反射实现依赖注入

概述

在Spring中,我们可以通过 @Autowired注解的方式为一个方法中注入参数,那么这种方法背后到底发生了什么呢,这篇文章将讲述如何用Java的注解和反射实现一个“低配版”的依赖注入。

下面是我们要做的一些事情:

  • 通过 @interface的方式定义一个注解
  • 为某个希望杯被注入的方法添加这个注解
  • 编写测试代码,通过反射获取添加了注解的方法对应的Method对象,将该方法对象设置为可访问的,通过反射创建对象并调用这个方法,同时注入依赖数据

如上所述,我们分为三个步骤, 去加工出这个低配版的依赖注入,下面就来讲讲每一步的详细步骤

我们要编写的代码的结构分为三部分:

  • Autowired: 声明的注解
  • Demo类:含有被依赖注入的方法
  • setStrTest类:通过反射获取被Autowired注解的方法,并进行依赖注入

定义注解

Autowired


@Retention(RetentionPolicy.RUNTIME)
public @interface Autowired {

}

首先我们通过 @interface的方式定义的一个注解, 由此也可以看出注解的地位和类,接口类似,是一种同一级的关系

@Retention是元注解,故名思义,它是用来注解(动词)注解(名词)的注解!(名词),RetentionPolicy.RUNTIME 表示会将这个注解保留到运行时,这样的话我们就能通过反射去处理注解了。

为被注入的方法添加注解

下面我们为setStr方法添加一个注解


public class Demo {
    private String str;

    @Autowired
    public void setStr (String str) {
       this.str = str;
    }

    public String getStr () {
        return str;
    }
}

通过反射处理注解

通过反射的方式获取并处理被注解的方法,将该方法对象设置为可访问的,通过反射创建对象并调用这个方法,同时注入依赖数据

由于涉及到大量关于反射的API,所以对于反射机制话可以看看我以前写的这篇文章: https://www.cnblogs.com/penghuwan/p/7580145.html

在这一步骤我们要做的事情:

1.调用Class.forName方法,传入某个类的路径字符串为参数,获取该类的Class对象

2.通过调用该类Class对象的getDeclaredMethods方法,获得声明方法对应的Methods对象组成的数组

3.遍历2中的Methods数组,通过调用Method对象的isAnnotationPresent方法判断该方法有没有加上Autowired注解,并对其中加上Autowired注解的方法做以下处理

4.通过调用Method对象的setAccessible(true);方法将对象设置为可访问的,不这么搞下一步调用方法会出错

5.通过Class对象的newInstance方法创建对象实例,假设其为object,则再通过method.invoke(object, “传入的数据")调用对象的方法,注入依赖数据

6.将5中的对象实例object返回, 我们就获得了被注入了依赖数据的对象实例了

代码如下:

Test.java


import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test {
    
    public static Object injectStrToInstance (String ClassName,String str) throws ClassNotFoundException {
        // 获取Demo的Class对象
        Class demoClass = Class.forName(ClassName);
        // 从Class对象中获取Demo中声明方法对应的Method对象
        Method [] methods = demoClass.getDeclaredMethods();
        for (Method method : methods) {
            // 判断方法是否被加上了@Autowired这个注解
            if(method.isAnnotationPresent(Autowired.class)) {
                // 将方法设置为可调用的
                method.setAccessible(true);
                try {
                    Object object = demoClass.newInstance();
                    // 调用method方法,向其中注入str字符串
                    method.invoke(object,str);
                    return object;
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                } catch (InstantiationException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

    public static void main (String args []) throws ClassNotFoundException {
        // 进行依赖注入,并取得注入后的Demo的对象实例
       Demo demo1 = (Demo)injectStrToInstance("Demo", "我是被注入的文本");
       // 输出一下看看我们的文本是不是被成功注入进去了
       System.out.println(demo1.getStr());
    }
}

输出结果:

我是被注入的文本

到此为止, 我们就完成了这个低配版的依赖注入了

以上就是如何用Java注解和反射实现依赖注入的详细内容,更多关于Java注解和反射实现依赖注入的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何用Java注解和反射实现依赖注入

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

PHP反射:实现依赖注入的高效方法

PHP反射:实现依赖注入的教程PHP反射是一种强大的技术,它允许开发者在运行时动态地访问和修改类的属性和方法。这种技术使得代码更加灵活和可维护,因为它允许我们通过简单的属性访问来调用方法,而无需知道方法的具体实现。然而,这也带来了一些挑战,因为我们需要确保反射能够正确地解析和执
PHP反射:实现依赖注入的高效方法
PHP2024-12-19

在 Java 中,如何通过 composition 实现依赖注入?(java中composition如何实现依赖注入)

在Java开发中,依赖注入是一种重要的设计模式,它有助于解耦组件之间的依赖关系,提高代码的可维护性和可测试性。其中,composition(组合)是实现依赖注入的一种常见方式。本文将详细介绍在Java中如何通过composition实现依赖注入。一、
在 Java 中,如何通过 composition 实现依赖注入?(java中composition如何实现依赖注入)
2024-12-13

java Spring中如何实现依赖注入

总得来说,Spring中依赖注入有这么三种方式:①通过set方式赋值②通过构造器赋值③通过p标签赋值java相关视频教程推荐:java视频下面我们稍稍展开来谈:1.通过set方式赋值主要用到围堵标签来传递值此处的name就是Teacher类里声明的变量名,va
java Spring中如何实现依赖注入
2019-11-15

Sprin如何控制反转和依赖注入

本篇内容主要讲解“Sprin如何控制反转和依赖注入”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Sprin如何控制反转和依赖注入”吧!控制反转的类型控制反转(IOC)旨在提供一种更简单的机制,来
2023-06-29

C#中如何实现依赖注入

在C#中实现依赖注入通常可以使用一些现成的框架,比如ASP.NET Core中自带的依赖注入容器。以下是一个简单的示例:首先,定义一个接口和一个实现该接口的类:public interface IMyService{void DoSo
C#中如何实现依赖注入
2024-04-03

ASP.NET MVC如何实现依赖注入

这篇文章主要介绍了ASP.NET MVC如何实现依赖注入,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言在java的spring中有自动注入功能,使得代码变得更加简洁灵活,
2023-06-28

SpringBoot中如何实现注入依赖

SpringBoot中如何实现注入依赖?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。今天给大家介绍一下SpringBoot中是如何实现依赖注入的功能。在以往spring使用
2023-05-31

laravel的依赖注入和控制反转怎么实现

这篇文章主要介绍“laravel的依赖注入和控制反转怎么实现”,在日常操作中,相信很多人在laravel的依赖注入和控制反转怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”laravel的依赖注入和控制
2023-06-30

如何在PHP中实现依赖注入

这篇文章给大家介绍如何在PHP中实现依赖注入,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。首先,我们来看一段代码:class A{ public function echo() {
2023-06-17

如何详细理解 Java getBean 的依赖注入过程?(Java getBean的依赖注入过程)

在Java开发中,依赖注入(DependencyInjection,DI)是一种重要的设计模式和编程习惯,它使得代码的耦合度降低,可维护性和可测试性提高。而getBean方法在Java的依赖注入过程中扮演着关键的角色。一、依赖注入的概念和重要性
如何详细理解 Java getBean 的依赖注入过程?(Java getBean的依赖注入过程)
Java2024-12-21

如何在Java中运用依赖注入

今天就跟大家聊聊有关如何在Java中运用依赖注入,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、C++的诟病C++最遭人诟病的地方就是定义一个类需要写两个文件,一个.h文件和一个.
2023-06-15

php中如何使用laravel实现依赖注入

这篇文章主要介绍“php中如何使用laravel实现依赖注入”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php中如何使用laravel实现依赖注入”文章能帮助大家解决问题。laravel容器包含控
2023-07-04

PHP 函数中如何实现依赖注入?

依赖注入是一种设计模式,允许在函数中注入外部依赖项。php 函数可通过使用函数参数来实现依赖注入,例如传递pdo实例来注入数据库连接。依赖注入的优点包括可测试性、可维护性和可扩展性。PHP 函数中实现依赖注入什么是依赖注入?依赖注入是一
PHP 函数中如何实现依赖注入?
2024-04-28

Web API中如何使用Autofac实现依赖注入

这篇文章主要介绍了Web API中如何使用Autofac实现依赖注入的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Web API中如何使用Autofac实现依赖注入文章都会有所收获,下面我们一起来看看吧。一、创
2023-06-29

在ABAP里如何模拟实现Java Spring的依赖注入

这篇文章将为大家详细讲解有关在ABAP里如何模拟实现Java Spring的依赖注入,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。尝试的场景在现实生活中,每一盏灯都有一个开关控制。按下开关,灯被打开;再按
2023-06-02

如何使用Java注解和反射实现Junit4中的用例调用

这篇文章主要讲解了“如何使用Java注解和反射实现Junit4中的用例调用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用Java注解和反射实现Junit4中的用例调用”吧!实例需求需
2023-06-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录