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")){ //比如 setUserDao mn=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; @Test public 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修饰时,一定要设置可访问为true field.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; @Test public void abc(){ System.out.println(userDao); } }
mybatis-java-依赖注入的更多相关文章
- java依赖注入(injection)
和SpringSource分别通过其开源项目Guice及Spring Framework提供了依赖注入的功能.然而直到现在开发者也没有一种标准的.独立于供应商的方式从而无需修改其源文件就能在这些框架之 ...
- Java 依赖注入标准(JSR-330)简介
作者:88250 ,Vanessa 时间:2009 年 11 月 19 日 Java 依赖注入标准(JSR-330,Dependency Injection for Java)1.0 规范已 ...
- java依赖注入
接口的作用 1.在spide中创建一个私有接口 private Downloadable downlaodable 覆盖set get 方法 创建一个方法 Public Page down load ...
- java 依赖注入
https://blog.csdn.net/coderder/article/details/51897721 前言 在软件工程领域,依赖注入(Dependency Injection)是用于实现控制 ...
- Java依赖注入方式
pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w ...
- 开涛spring3(12.2) - 零配置 之 12.2 注解实现Bean依赖注入
12.2 注解实现Bean依赖注入 12.2.1 概述 注解实现Bean配置主要用来进行如依赖注入.生命周期回调方法定义等,不能消除XML文件中的Bean元数据定义,且基于XML配置中的依赖注入的 ...
- 注解实现Bean依赖注入
12.2.1 概述 注解实现Bean配置主要用来进行如依赖注入.生命周期回调方法定义等,不能消除XML文件中的Bean元数据定义,且基于XML配置中的依赖注入的数据将覆盖基于注解配置中的依赖注入的数 ...
- Android 和 Dagger 2 中的依赖注入
原文:Dependency Injection in Android with Dagger 2 作者:Joe Howard 译者:kmyhy 在现代开发团队中到处充斥着"你一定要用依赖注入 ...
- Objection, 一个轻量级的Objective-C依赖注入框架
简介 项目主页:https://github.com/atomicobject/objection 实例下载: https://github.com/ios122/ios122 Objection 是 ...
- Java之控制反转和依赖注入
1.简介 依赖注入和控制反转,目的是为了使类与类之间解耦合,提高系统的可扩展性和可维护性,下面通过一个例子来引入这一概念. 2.案例 1)一般情况下的类耦合 Main.java public clas ...
随机推荐
- Ubuntu与Centos在登陆安全方面的比较
Ubuntu在安装时创建的普通用户默认具有sudo权限,默认root没有设置密码,可以通过自建用户来执行sudo passwd 为root设置密码;Centos在安装时创建的普通用户默认没有sudo权 ...
- 7.21.01 if语句
if语句 一个if语句包含一个布尔表达式和一条或多条语句. 语法 if语句的用语法如下: if(布尔表达式) { //如果布尔表达式为true将执行的语句 } 如果布尔表达式的值为true,则执行if ...
- Java 的概述
Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是有SunMicrosystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE,JavaEE,JavaME ...
- virtualbox下正确虚拟机修改设备名称
在学习大数据管理过程中,想要修改虚拟机的设备名称(因为名称太长),所以就直接在右上角的设置中找到详细设置,直接修改设备名称,结果启动Hadoop失败!!!! 后来参考网上问题解决弄好了,现在给出修改设 ...
- Linux Command Line learning
https://www.codecademy.com/en/courses/learn-the-command-line Background The command line is a text i ...
- python环境搭建和打包
安装: python是有两个版本的一个是2.x,一个是3.x,这两个版本是不兼容的所有请使用前看准版本.下面我们主要说3.5版本. Mac:https://www.python.org/ftp/pyt ...
- informatica9 安装下载,安装教程 介质(文章和视频教程)(csdn讲师:Array)
Informatica学习: 参考文献:视频参考地址:http://edu.csdn.net/course/detail/5034,ETL之informatica9通关班(第二期) 1.安装介质的获 ...
- 大数问题:打印从1到最大的n位数
//打印从1到最大的n位数:大数问题,用字符串表示数字来避免溢出 bool increment(char* number){ bool isOverFlow = false; int nTakeOve ...
- dispatch emit broadcast
1.broadcast 事件广播 遍历寻找所有子孙组件,假如子孙组件和componentName组件名称相同的话,则触发$emit的事件方法,数据为 params. 如果没有找到 则使用递归的方式 继 ...
- 使用DOM解析XML文件,、读取xml文件、保存xml、增加节点、修改节点属性、删除节点
使用的xml文件 <?xml version="1.0" encoding="GB2312" ?> <PhoneInfo> <Br ...