第一种  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-依赖注入的更多相关文章

  1. java依赖注入(injection)

    和SpringSource分别通过其开源项目Guice及Spring Framework提供了依赖注入的功能.然而直到现在开发者也没有一种标准的.独立于供应商的方式从而无需修改其源文件就能在这些框架之 ...

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

    作者:88250 ,Vanessa 时间:2009 年 11 月 19 日      Java 依赖注入标准(JSR-330,Dependency Injection for Java)1.0 规范已 ...

  3. java依赖注入

    接口的作用 1.在spide中创建一个私有接口 private Downloadable downlaodable 覆盖set get 方法 创建一个方法  Public Page down load ...

  4. java 依赖注入

    https://blog.csdn.net/coderder/article/details/51897721 前言 在软件工程领域,依赖注入(Dependency Injection)是用于实现控制 ...

  5. Java依赖注入方式

    pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w ...

  6. 开涛spring3(12.2) - 零配置 之 12.2 注解实现Bean依赖注入

    12.2  注解实现Bean依赖注入 12.2.1  概述 注解实现Bean配置主要用来进行如依赖注入.生命周期回调方法定义等,不能消除XML文件中的Bean元数据定义,且基于XML配置中的依赖注入的 ...

  7. 注解实现Bean依赖注入

    12.2.1  概述 注解实现Bean配置主要用来进行如依赖注入.生命周期回调方法定义等,不能消除XML文件中的Bean元数据定义,且基于XML配置中的依赖注入的数据将覆盖基于注解配置中的依赖注入的数 ...

  8. Android 和 Dagger 2 中的依赖注入

    原文:Dependency Injection in Android with Dagger 2 作者:Joe Howard 译者:kmyhy 在现代开发团队中到处充斥着"你一定要用依赖注入 ...

  9. Objection, 一个轻量级的Objective-C依赖注入框架

    简介 项目主页:https://github.com/atomicobject/objection 实例下载: https://github.com/ios122/ios122 Objection 是 ...

  10. Java之控制反转和依赖注入

    1.简介 依赖注入和控制反转,目的是为了使类与类之间解耦合,提高系统的可扩展性和可维护性,下面通过一个例子来引入这一概念. 2.案例 1)一般情况下的类耦合 Main.java public clas ...

随机推荐

  1. linux 下 Fatal error: Class ‘mysqli’ not found in

    先试用这种方法 http://blog.csdn.net/u010429424/article/details/43063211 我不知道自己安装的php 没他们路径,所以用了以下这种方法处理,并且不 ...

  2. 转载_2012年的Android之旅:梦想、学习、坚持、自信、淡定

    原文地址:http://blog.csdn.net/luoshengyang/article/details/8452527 2012年的Android之旅:梦想.学习.坚持.自信.淡定.. ---- ...

  3. BotVS开发基础—2.5 绘制图表

    代码 import time import math def main(): chart = { # 用于初始化 图表的对象 'title': {'text': "line数值触发 plot ...

  4. React渲染问题研究以及Immutable的应用

    写在前面 这里主要介绍自己在React开发中的一些总结,关于react的渲染问题的一点研究. 另外本人一直希望在React项目中尝试使用,因此在之前已经介绍过immutable的API,可以参看这里I ...

  5. poj2828 Buy ticket

    Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get ...

  6. Eclipse常用快捷键记录

    Eclipse简介: Eclipse 是一个开放源代码的.基于Java的可扩展开发平台.就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境.幸运的是,Eclipse 附带了一个标准的 ...

  7. JSP知识点大致介绍1

    解释:当jsp写好,运行服务器,还没有发出请求(写网址按Enter),Tomcat的work下是没有字节码文件的.当写网址:localhost:8888/xxxx/index.jsp按Enter,运行 ...

  8. crontab 各参数详解及如何查看日志记录

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt145 crontab各参数说明: crontab [-u user] [fi ...

  9. 学习之-ASP.NET MVC Filter

    MVC Filter 是典型的AOP应用,对MVC框架处理客户端请求注入额外的一些逻辑,如日志记录.缓存处理.异常处理和权限验证,性能检测(横切关注点),而这些逻辑通常与主要业务无关,被独立分开作为公 ...

  10. 寻找Harris、Shi-Tomasi和亚像素角点

    Harris.Shi-Tomasi和亚像素角点都是角点,隶属于特征点这个大类(特征点可以分为边缘.角点.斑点). 一.Harris角点检测是一种直接基于灰度图像的角点提取算法,稳定性较高,但是也可能出 ...