mybatis-java-依赖注入
第一种 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-依赖注入相关推荐
- Java 依赖注入标准(JSR-330)简介
Java 依赖注入标准(JSR-330)简介 转载请保留作者信息: 作者:88250 ,Vanessa 时间:2009 年 11 月 19 日 Java 依赖注入标准(JSR-330,Dependen ...
- java依赖注入_Java依赖注入选项
java依赖注入 我想花一些时间来总结一些流行的Java依赖注入(DI)框架. 这是可用功能的高级概述. 首先,什么是依赖注入? "依赖注入是一种软件设计模式,可以删除硬编码的依赖,并可以在 ...
- Java依赖注入选项
我想花一些时间来总结一些流行的Java依赖注入(DI)框架. 这是可用功能的高级概述. 首先,什么是依赖注入? "依赖注入是一种软件设计模式,可以删除硬编码的依赖,并可以在运行时或编译时更改 ...
- Java依赖注入 - DI设计模式示例教程
Java依赖注入 - DI设计模式示例教程 Java依赖注入 设计模式允许我们删除硬编码的依赖项,并使我们的应用程序松散耦合,可扩展和可维护.我们可以在java中实现依赖注入,以将依赖项解析从编译时移 ...
- JSR-330 JAVA 依赖注入标准API说明
JSR-330 JAVA 依赖注入标准 文章目录 JSR-330 JAVA 依赖注入标准 Package javax.inject @Inject注解 @Qualifier注解 `Interface ...
- Java依赖注入(DI)实例详解
Java依赖注入模式允许我们摆脱硬编码,使我们的应用更加松耦合.增强扩展性以及可维护性.通过依赖注入我们可以降低从编译到运行时的依赖性. Java依赖注入 Java的依赖注入仅仅通过理论是很难解明白的 ...
- 【概念题】java依赖注入,android开发实战-记账本清风紫雪
这是使用构造器注入来装配bean 2.setter注入 这是使用setter注入,p是spring的名称空间,可以用来代替标签. 四.装配的概念 创建应用对象之间协作关系的行为称为装配.也就是说当一个 ...
- java 什么时候依赖注入_玩框架java依赖注入 – 何时使用单例
So I am wondering, should I be using singleton objects as the examples seem to imply? If this is the ...
- java依赖注入inject_@inject依赖注入的过程
首先需要知道实例是如何创建以及如何被注入的,而这一切都由container这个容器进行管理. @H_403_6@1.实例构建 class ContainerImpl implements Contai ...
- java依赖注入上下文_【Java EE】--Contexts and Dependency Injection (上下文與依賴注入)04...
使用范圍 對於Web應用程序來使用注入另一個bean類的bean,bean需要能夠在用戶與應用程序交互的持續時間內保持狀態. 定義這個狀態的方法是給bean一個范圍. 您可以給對象表23-1中描述的任 ...
最新文章
- 配置Open***使用User/Pass方式验证登录
- DataGrid中添加DropdownList时的数据绑定
- cisco 《连接网络》实验wan综合实验_GNS3实验环境优化与安装
- C Primer+Plus(十七)高级数据表示 编程练习(二)
- Java开发知识之Java的异常处理
- Java String类的相关操作
- net 调用java_NET调用Java之100-Continue的坑
- 排序算法--选择排序
- C#XmlHelper操作Xml文档的帮助类
- Java启动sparksql,启动spark-sql报错
- 使用自己的激光雷达在cartographer导航框架下绘制地图,报错 lua_parameter_dictionary.cc:83] Check failed: status == 0解决方法。
- Mac小技巧:五秒学会Mac电脑旋转屏幕
- 腾讯的“小弟”长大了
- BUG生命周期和管理
- Android 环信 消息免打扰 实现
- python装饰器原理wraps(method)(self)_理解Python中装饰器最佳方法~
- 信息时代的管理信息系统
- 李立超python视频_《李》字意思读音、组词解释及笔画数 - 新华字典 - 911查询
- 对如何确定测试预期结果的一些记录
- AE基础教程(12)——第12章 轨道遮罩
热门文章
- 國慶和中秋的學習成果
- 工业级多用户博客系统
- 冒泡排序算法的 JavaScript 实现
- D3中数据与DOM element绑定之data() enter() exit()浅析
- 原创:Spring整合junit测试框架(简易教程 基于myeclipse,不需要麻烦的导包)
- c++11 stl 学习之 shared_ptr
- Android平滑移动——Scroller类研究
- 交换两个变量的值的效率的测试
- Example3_3
- web developer tips (65): 快速创建一个挂接SQL表的GridView