第一种  setXXX形式的注入

我们的所有dao都会继承自定义的BaseDao,因此在BaseDao中完成对所有dao的注入

在DaoUtil中增加方法injectDao()来注入具体的dao

package com.yangwei.shop.util;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;import com.yangwei.shop.dao.IDaoFactory;/**dao工具类,主要使用反射机制*/
public class DaoUtil {/*** 思路:获取自己的所有方法,在判断是否有setXXX方法,如果有就对这个方法进行对象注入*/public static void injectDao(Object obj){try {//1,获取自己定义的所有方法Method[] methods=obj.getClass().getDeclaredMethods();for(Method method:methods){//获取方法名String mn=method.getName();//2,查找set方法  if(mn.startsWith("set")){//比如 setUserDaomn=mn.substring(3);mn=mn.substring(0, 1).toLowerCase()+mn.substring(1);//3,从我们定义的工厂中获取dao对象Object o=DaoUtil.createDaoFactory().getDao(mn);//4,利用反射调用方法注入//method是setXXX方法,调用者是this,参数是工厂取的具体dao对象
                    method.invoke(obj, o);}}} catch (SecurityException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}public static IDaoFactory createDaoFactory(){Properties prop = PropertiesUtil.getDaoProp();try {Class clz=Class.forName((String)prop.get("factory"));String mm="getInstance";Method method=clz.getMethod(mm);//调用静态方法   使用类来调用return (IDaoFactory)method.invoke(clz);    } catch (ClassNotFoundException e) {// TODO Auto-generated catch block
            e.printStackTrace();}catch (SecurityException e) {// TODO Auto-generated catch block
            e.printStackTrace();} catch (NoSuchMethodException e) {// TODO Auto-generated catch block
            e.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch block
            e.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch block
            e.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch block
            e.printStackTrace();}return null;}}

在BaseDao类中增加构造来调用injectDao方法,目的是继承BaseDao的具体Dao内部可能有其它dao需要使用,完成注入

    public BaseDao(){DaoUtil.injectDao(this);}

写一个基础测试类,完成对测试类中所有setXXX的注入,其实这里针对的是Dao的注入

package com.yangwei.shop.test;import com.yangwei.shop.util.DaoUtil;public class BaseTest {public BaseTest(){DaoUtil.injectDao(this);}
}

每一个测试类继承BaseDao即可,写上get set方法即可,对用到的dao进行注入

package com.yangwei.shop.test;import org.junit.Test;import com.yangwei.shop.dao.UserDao;public class TestInject extends BaseTest{/*** 测试set形式的依赖注入*/private UserDao userDao=null;@Testpublic void testSetDao(){System.out.println(userDao);}public UserDao getUserDao() {return userDao;}public void setUserDao(UserDao userDao) {this.userDao = userDao;}}

第二种  annotation形式的注入

自定义注解类

package com.yangwei.shop.entity;import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;/*** 用这个annotation标注需要进行依赖注入的方法* @ShopDi("userDao"),说明需要注入userDao对象* 如果是@ShopDi就规定使用setXXX注入**/
//必须让它在运行时能够执行
@Retention(RetentionPolicy.RUNTIME)
public @interface ShopDi {/*** value是Annotation的默认属性,在定义的时候可以不用vaule=""定义,而是直接通过* @ShopDi("XXX")* 特别注意,当需要定义两个以上的属性时,默认属性就不起作用了,此时需要如下形式定义* @ShopDi(value="XXX",abc="YYY")*/String value() default "";
}

在DaoUtil中增加方法injectDao1()来注入具体的dao

/*** 使用注解的形式,完成对Dao对象的注入* @param obj*/public static void injectDao1(Object obj){try {//针对属性的注解Field[] fields=obj.getClass().getDeclaredFields();for(Field field:fields){//有ShopDi的注解的属性if(field.isAnnotationPresent(ShopDi.class)){ShopDi shopDi=field.getAnnotation(ShopDi.class);String value=shopDi.value();if(value==null || "".equals(value.trim())){//为空时,使用属性名称value=field.getName();}Object o=DaoUtil.createDaoFactory().getDao(value);//当属性被private修饰时,一定要设置可访问为truefield.setAccessible(true);field.set(obj, o);}}} catch (SecurityException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}

基础测试类中,调用刚刚写的方法

package com.yangwei.shop.test;import com.yangwei.shop.util.DaoUtil;public class BaseTest {public BaseTest(){DaoUtil.injectDao(this);}
}

具体的测试类继承BaseTest类,对需要注入dao的属性添加自定义注解

package com.yangwei.shop.test;
import org.junit.Test;import com.yangwei.shop.dao.UserDao;
import com.yangwei.shop.entity.ShopDi;public class TestAnnotation extends BaseTest{@ShopDi("userDao")private UserDao userDao;@Testpublic void abc(){System.out.println(userDao);}  }

转载于:https://www.cnblogs.com/yangw/p/3334740.html

mybatis-java-依赖注入相关推荐

  1. Java 依赖注入标准(JSR-330)简介

    Java 依赖注入标准(JSR-330)简介 转载请保留作者信息: 作者:88250 ,Vanessa 时间:2009 年 11 月 19 日 Java 依赖注入标准(JSR-330,Dependen ...

  2. java依赖注入_Java依赖注入选项

    java依赖注入 我想花一些时间来总结一些流行的Java依赖注入(DI)框架. 这是可用功能的高级概述. 首先,什么是依赖注入? "依赖注入是一种软件设计模式,可以删除硬编码的依赖,并可以在 ...

  3. Java依赖注入选项

    我想花一些时间来总结一些流行的Java依赖注入(DI)框架. 这是可用功能的高级概述. 首先,什么是依赖注入? "依赖注入是一种软件设计模式,可以删除硬编码的依赖,并可以在运行时或编译时更改 ...

  4. Java依赖注入 - DI设计模式示例教程

    Java依赖注入 - DI设计模式示例教程 Java依赖注入 设计模式允许我们删除硬编码的依赖项,并使我们的应用程序松散耦合,可扩展和可维护.我们可以在java中实现依赖注入,以将依赖项解析从编译时移 ...

  5. JSR-330 JAVA 依赖注入标准API说明

    JSR-330 JAVA 依赖注入标准 文章目录 JSR-330 JAVA 依赖注入标准 Package javax.inject @Inject注解 @Qualifier注解 `Interface ...

  6. Java依赖注入(DI)实例详解

    Java依赖注入模式允许我们摆脱硬编码,使我们的应用更加松耦合.增强扩展性以及可维护性.通过依赖注入我们可以降低从编译到运行时的依赖性. Java依赖注入 Java的依赖注入仅仅通过理论是很难解明白的 ...

  7. 【概念题】java依赖注入,android开发实战-记账本清风紫雪

    这是使用构造器注入来装配bean 2.setter注入 这是使用setter注入,p是spring的名称空间,可以用来代替标签. 四.装配的概念 创建应用对象之间协作关系的行为称为装配.也就是说当一个 ...

  8. java 什么时候依赖注入_玩框架java依赖注入 – 何时使用单例

    So I am wondering, should I be using singleton objects as the examples seem to imply? If this is the ...

  9. java依赖注入inject_@inject依赖注入的过程

    首先需要知道实例是如何创建以及如何被注入的,而这一切都由container这个容器进行管理. @H_403_6@1.实例构建 class ContainerImpl implements Contai ...

  10. java依赖注入上下文_【Java EE】--Contexts and Dependency Injection (上下文與依賴注入)04...

    使用范圍 對於Web應用程序來使用注入另一個bean類的bean,bean需要能夠在用戶與應用程序交互的持續時間內保持狀態. 定義這個狀態的方法是給bean一個范圍. 您可以給對象表23-1中描述的任 ...

最新文章

  1. 配置Open***使用User/Pass方式验证登录
  2. DataGrid中添加DropdownList时的数据绑定
  3. cisco 《连接网络》实验wan综合实验_GNS3实验环境优化与安装
  4. C Primer+Plus(十七)高级数据表示 编程练习(二)
  5. Java开发知识之Java的异常处理
  6. Java String类的相关操作
  7. net 调用java_NET调用Java之100-Continue的坑
  8. 排序算法--选择排序
  9. C#XmlHelper操作Xml文档的帮助类
  10. Java启动sparksql,启动spark-sql报错
  11. 使用自己的激光雷达在cartographer导航框架下绘制地图,报错 lua_parameter_dictionary.cc:83] Check failed: status == 0解决方法。
  12. Mac小技巧:五秒学会Mac电脑旋转屏幕
  13. 腾讯的“小弟”长大了
  14. BUG生命周期和管理
  15. Android 环信 消息免打扰 实现
  16. python装饰器原理wraps(method)(self)_理解Python中装饰器最佳方法~
  17. 信息时代的管理信息系统
  18. 李立超python视频_《李》字意思读音、组词解释及笔画数 - 新华字典 - 911查询
  19. 对如何确定测试预期结果的一些记录
  20. AE基础教程(12)——第12章 轨道遮罩

热门文章

  1. 國慶和中秋的學習成果
  2. 工业级多用户博客系统
  3. 冒泡排序算法的 JavaScript 实现
  4. D3中数据与DOM element绑定之data() enter() exit()浅析
  5. 原创:Spring整合junit测试框架(简易教程 基于myeclipse,不需要麻烦的导包)
  6. c++11 stl 学习之 shared_ptr
  7. Android平滑移动——Scroller类研究
  8. 交换两个变量的值的效率的测试
  9. Example3_3
  10. web developer tips (65): 快速创建一个挂接SQL表的GridView