依赖注入的原理就是简单说就是从头往下递归生成依赖对象的,然后对引用字段赋值最后返回。

这里实现通过变量类型来生成相应的对象。

模拟一个用户的注册业务,首先是controller层调用service层,然后调用dao层代码实现保存用户。

文件结构:

UserController

package cn.wzy.controller;import cn.wzy.DI.Inject;
import cn.wzy.service.UserService;/*** Create by Wzy* on 2018/8/3 14:31* 不短不长八字刚好*/
public class UserController {@Injectprivate UserService userService;public void save() {userService.save();}public UserController() {}
}

UserService:模拟保存用户,更新相关班级的操作

package cn.wzy.service;import cn.wzy.dao.ClassDao;
import cn.wzy.dao.UserDao;
import cn.wzy.DI.Inject;/*** Create by Wzy* on 2018/8/3 14:29* 不短不长八字刚好*/
public class UserService {@Injectprivate UserDao userDao;@Injectprivate ClassDao classDao;public void save() {userDao.save();classDao.save();}public UserService() {}
}

ClassDao:

package cn.wzy.dao;/*** Create by Wzy* on 2018/8/3 14:28* 不短不长八字刚好*/public class ClassDao {public ClassDao() {}public void save() {System.out.println("------start--------");System.out.println("this is ClassDao...");System.out.println("i'm saving......");System.out.println("-------end---------");}
}

UserDao

package cn.wzy.dao;/*** Create by Wzy* on 2018/8/3 14:24* 不短不长八字刚好*/
public class UserDao {public UserDao() {}public void save() {System.out.println("------start--------");System.out.println("this is UserDao...");System.out.println("i'm saving........");System.out.println("-------end---------");}
}

自定义注解没有任何信息,就只是为了标识是否需要注入。

package cn.wzy.DI;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** Create by Wzy* on 2018/8/3 14:25* 不短不长八字刚好*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Inject {}

BeanFactory:这就是生成依赖对象的核心代码逻辑啦:主要是通过生成相应的对象然后不断递归。

package cn.wzy.DI;import java.lang.reflect.Field;/*** Create by Wzy* on 2018/8/3 14:24* 不短不长八字刚好*/public class BeanFactory {public static <Q> Q getBean(Class<Q> clazz) {Q result = null;try {result = clazz.newInstance();} catch (InstantiationException e) {e.printStackTrace();System.out.println("get the " + clazz.getName() + "failed!!");return null;} catch (IllegalAccessException e) {System.out.println("get the " + clazz.getName() + "failed!!");e.printStackTrace();return null;}//查找所有的字段Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {//查找字段中含有依赖注入的字段 存在就进行注入Inject inject = field.getAnnotation(Inject.class);if (inject != null) {Object object = getBean(field.getType());if (!field.isAccessible())field.setAccessible(true);try {field.set(result,object);} catch (IllegalAccessException e) {e.printStackTrace();System.out.println("Inject the " + field.getName() + "failed!!");}}}return result;}
}

测试:

package cn.wzy.test;import cn.wzy.DI.BeanFactory;
import cn.wzy.controller.UserController;/*** Create by Wzy* on 2018/8/3 14:33* 不短不长八字刚好*/
public class UserControllerTest {public static void main(String[] args) {UserController userController = BeanFactory.getBean(UserController.class);userController.save();}}

输出:成功注入对象。

通过自定义注解和java反射实现Spring-DI依赖注入相关推荐

  1. Spring DI(依赖注入)注解篇

    1 课程内容介绍 我之前写的的一篇博客Spring核心功能DI(依赖注入)xml篇主要介绍了如何通过配置xml的方式来实现依赖注入,今天我们来介绍如何通过注解方式完成我们的依赖注入操作. 2 注入基本 ...

  2. 手写Spring DI依赖注入,嘿,你的益达!

    手写DI 提前实例化单例Bean DI分析 DI的实现 构造参数依赖 一:定义分析 二:定义一个类BeanReference 三:BeanDefinition接口及其实现类 四:DefaultBean ...

  3. Spring DI(依赖注入)

    DI依赖注入 IoC(Inversion Of Control)控制翻转,Spring反向控制应用程序所需要使用的外部资源 DI(Dependency Injection)依赖注入,应用程序运行依赖的 ...

  4. Spring DI(依赖注入)Xml篇

    1 DI(依赖注入)简单介绍 如果您对Spring了解甚少,建议先移步我的另一篇博客Spring核心功能IOC之HelloWorld因为下面的内容是在该文章基础上进行阐述的 .我们可以通过一段简单代码 ...

  5. Spring DI依赖注入讲解

    DI:dependency injection 依赖注入 在spring框架负责创建Bean对象时,动态将依赖对象注入到Bean组件. public class UserServiceImpl imp ...

  6. 结合自定义注解,java反射和comparator实现对象的排序

    开头一注:本代码是在学习comparator时,想到是否能写一个排序的工具类,在思考过后决定结合注解来实现排序,目前代码还比较粗犷,请大神指教,请大家轻喷. 一.新增自定义注解 @Documented ...

  7. java框架篇---spring IOC依赖注入

    spring依赖注入的方式有4种 构造方法注入 属性注入 工厂注入 注解注入 下面通过一个实例统一讲解: User.java package com.bjsxt.model;public class ...

  8. Spring DI[依赖注入]

    依赖注入(Dependency Injection,简称DI)意思是由容器或者框架将被调用类注入给调用对象,以此来降低调用对象和被调用类之间的依赖关系. 依赖注入主要有2种不同的实现形式: 1. 构造 ...

  9. Spring DI依赖注入方式

    1.构造器注入 2.Set方式注入[重点] 依赖注入:Set注入 依赖:bean对象的创建依赖于容器 注入:bean对象中的所有属性,由容器来注入. [环境搭建] Student package co ...

最新文章

  1. java i18n实例_Java SpringMVC实现国际化整合案例分析(i18n) 专题
  2. 一文看懂95%置信区间
  3. 【转】工厂模式面向接口编程
  4. Windows 技术篇-LDSGameMaster文件夹有什么用,删除方法
  5. idea快捷键生成返回类型_十三肝了2晚的《IDEA操作手册-终极秘籍》终于来了......
  6. Ubuntu Server 16.04 LTS上使用Docker部署Tomcat修改为80端口
  7. redis-sentinel主从复制高可用
  8. java 加密解密简单实现
  9. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 4丨游戏玩法分析 I【难度简单】
  10. 单边指数信号的特点_今日股市分析:上证指数若能守住3400,蓄力反弹就有戏...
  11. Node.js:清理项目中的依赖
  12. 判断点是否在一个矩形内
  13. Eclipse 启动项目错误:class not found
  14. beforeunload中阻止提示关闭_React 系统中,在离开编辑页面前做提示
  15. 软件详细设计文档模板
  16. pdf批量下载网页文件,多种情景
  17. MIT 6.828 Lab1(从引导扇区开始)
  18. 编程题总结 链表问题常用解决方法
  19. 2023-2029全球斑马鱼行业调研及趋势分析报告
  20. 多卡聚合智能融合通信设备在智慧房车上的应用

热门文章

  1. 狼人杀校园升级版:学霸大战学渣 Who is the king of examination!
  2. 基于android的安卓订餐多商家点餐app
  3. 深度学习概述-神经网络与深度学习学习笔记(一)
  4. python写通讯录_Python实现命令行通讯录
  5. 长三角生物医药产业加速跑,飞桨螺旋桨为创新药企、医药技术伙伴装上AI大模型引擎...
  6. 2022年一级建造师建设工程项目管理考试模拟试题卷及答案
  7. 计算机网络实验报告(Wireshark 实验)
  8. 蓝眼睛、绿眼睛...漂亮的眼睛颜色是由什么决定的?
  9. 【原创】IP摄像头技术纵览(七)---P2P技术—UDP打洞实现内网NAT穿透
  10. show version命令