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 ...
随机推荐
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——解码篇:(二)用ffmpeg解码音频
其实这篇的内容和(一)用ffmpeg解码视频基本是一样的,重点还是给ffmpeg指定callback函数,而这个函数是从RTSP服务端那里获取音频数据的. 这里,解码音频的示例代码量之所以比解码视频的 ...
- 【win10】大水牛主机插入耳机没有声音
主机:大水牛,技嘉主板 操作系统:win10 问题:主机前面插入耳机,没有声音,扬声器图标出错 解决 一..插入耳机 二..Realtek高清晰音频管理器 1.打开音频管理器,点击右下角的设置 2.点 ...
- vue-cli脚手架npm相关文件解读(8)check-versions.js
系列文章传送门: 1.build/webpack.base.conf.js 2.build/webpack.prod.conf.js 3.build/webpack.dev.conf.js 4.bui ...
- 如何使用 flannel host-gw backend?- 每天5分钟玩转 Docker 容器技术(62)
flannel 支持多种 backend,前面我们讨论的是 vxlan,host-gw 是 flannel 的另一个 backend,本节会将前面的 vxlan backend 切换成 host-gw ...
- spring基于注解进行注入(个人记录)
spring的Bean基于注解进行配置,再结合自动装配属性,也就DI,其实说白了就相当于初始化的时候给对象赋初值. 配置文件的过程有些麻烦,记录一下. 基于注解进行配置: 1.在application ...
- 关于tomcat的Unsupported major.minor version 51.0问题记录
今天在构建一个应用时使用了注解的方式,可能是别的原因,正常访问一个servlet的时候报了一个从来没见过的错误. 2017-5-12 15:54:52 org.apache.catalina.core ...
- c++非STL全排列
#include <cstdio> #include <vector> #include <string> #include <iostream> #i ...
- 基于moco的mock server 简单应用 来玩玩吧
提起mock大家应该就知道是干嘛用的了,再次再介绍一种简单的方式,基于moco的mock server.步骤很简单: 1. 首先,要下载个moco的jar0_1482402640757_moco-ru ...
- Docker打包 Asp.Net Core应用,在CentOS上运行
本文主要介绍下运用docker虚拟技术打包Asp.net core应用. Docker作为一个开源的应用容器引擎,近几年得到广泛的应用,使用Docker我们可以轻松实现应用的持续集成部署,一次打包,到 ...
- HTML canvas 笑脸
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...