一、编写Dao类

1
2
3
4
5
6
7
8
9
10
11
package cn.com.songjy.annotation;
 
import java.util.Date;
 
public class MyDao {
 
    public String time(){
        return "你好,现在的时间是:" + new Date();
    }
     
}

二、编写属性文件【my.properties,类似spring的配置文件】并将MyDao类配置到其中,如下:

1
myDao=cn.com.songjy.annotation.MyDao

三、编写读取属性配置文件的类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package cn.com.songjy.annotation;
 
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
 
public class PropertiesUtil {
 
    private static InputStream in = PropertiesUtil.class.getClassLoader()
            .getResourceAsStream("my.properties");
 
    public PropertiesUtil() {
    }
 
    private static Properties props = new Properties();
 
    static {
        try {
            props.load(in);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    public static String getValue(String key) {
        return props.getProperty(key);
    }
 
    public static void updateProperties(String key, String value) {
        props.setProperty(key, value);
    }
}

四、编写注解类

1
2
3
4
5
6
7
8
9
10
11
12
package cn.com.songjy.annotation;
 
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
 
@Retention(RetentionPolicy.RUNTIME)
public @interface MyDiAnnotation {
 
    //public String name();
     
    String value() default "";//value是Annotation的默认属性
}

五、反射注入工具类编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package cn.com.songjy.annotation;
 
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
 
public class MyAnnotationUtil {
     
    MyAnnotationUtil(){
        di(this);
    }
 
    public static void di(Object obj){
         
        try {
             
            Method[] methods = obj.getClass().getDeclaredMethods();
             
            for (Method method : methods) {
                 
                if(method.isAnnotationPresent(MyDiAnnotation.class)){//只处理包含MyDiAnnotation的方法
                     
                    MyDiAnnotation diAnnotation = method.getAnnotation(MyDiAnnotation.class);
                     
                    String class_key = diAnnotation.value();
                     
                    if(null==class_key || class_key.trim().length()==0){//key值默认为setXXX中的XXX且第一个字母要转换为小写
                        class_key = method.getName().substring(3);
                        class_key = class_key.substring(0, 1).toLowerCase() + class_key.substring(1);
                    }
                     
                    method.invoke(obj, Class.forName(PropertiesUtil.getValue(class_key)).newInstance());
                     
                }
            }
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
     
}

六、编写测试类

测试类一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package cn.com.songjy.annotation;
 
public class MyService01 extends MyAnnotationUtil {
 
    MyDao myDao;
     
    public MyDao getMyDao() {
        return myDao;
    }
 
    @MyDiAnnotation
    public void setMyDao(MyDao myDao) {
        this.myDao = myDao;
    }
 
    public void hello(){
        System.out.println(myDao.time());
    }
     
    public static void main(String[] args) {
        new MyService01().hello();
    }
}

测试类二:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package cn.com.songjy.annotation;
 
public class MyService02 extends MyAnnotationUtil {
 
    MyDao dao;
     
    public MyDao getDao() {
        return dao;
    }
 
    @MyDiAnnotation("myDao")
    public void setDao(MyDao dao) {
        this.dao = dao;
    }
 
    public void hello(){
        System.out.println(dao.time());
    }
     
    public static void main(String[] args) {
        new MyService02().hello();
    }
}

输出结果如下:你好,现在的时间是:Sat Jun 29 17:02:03 CST 2013

Java反射及依赖注入简单模拟的更多相关文章

  1. 在ABAP里模拟实现Java Spring的依赖注入

    Dependency Injection- 依赖注入,在Java Spring框架中有着广泛地应用.通过依赖注入,我们不必在应用代码里繁琐地初始化依赖的资源,非常方便. 那么ABAP能否从语言层面上也 ...

  2. Spring依赖注入 --- 简单使用说明

    Spring依赖注入 --- 简单使用说明 本文将对spring依赖注入的使用做简单的说明,enjoy your time! 1.使用Spring提供的依赖注入 对spring依赖注入的实现方法感兴趣 ...

  3. IOC依赖注入简单实例

    转自:http://hi.baidu.com/xyz136299110/item/a32be4269e9d0c55c38d59e6 相信大家看过相当多的IOC依赖注入的例子. 但大家在没有明白原理的情 ...

  4. laravel中如何利用反射实现依赖注入

    依赖注入 在一个类中经常会依赖于其他的对象,先看一下经典的写法 class Foo { public $bar; public function __construct() { $this->b ...

  5. PHP类的反射和依赖注入

    /** * Class Point */ class Point { public $x; public $y; /** * Point constructor. * @param int $x ho ...

  6. Java代码实现依赖注入

    http://zhangjunhd.blog.51cto.com/113473/126545 这里将模仿Spring实现一种基于xml配置文件的依赖注入机制.文件中将实现3中注入,一是单值注入,包括i ...

  7. 【Java】 Spring依赖注入小试牛刀:编写第一个Spring ApplicationContext Demo

    0  Spring的依赖注入大致是这样工作的: 将对象如何构造(ID是什么?是什么类型?给属性设置什么值?给构造函数传入什么值?)写入外部XML文件里.在调用者需要调用某个类时,不自行构造该类的对象, ...

  8. Java Spring各种依赖注入注解的区别

    Spring对于Bean的依赖注入,支持多种注解方式: @Resource javax.annotation JSR250 (Common Annotations for Java) @Inject ...

  9. JAVA框架 Spring 依赖注入

    一:介绍 情景:我们在给程序分层的时候:web层.业务层.持久层,各个层之间会有依赖.比如说:业务层和持久层,业务层的代码在调用持久层的时候,传统方式:new 持久层类. 进而进行调用,这种方式会导致 ...

随机推荐

  1. 使用lock_sga和pre_page_sga参数保证SGA常驻物理内存 .

    Lock_sga LOCK_SGA locks the entire SGA into physical memory. It is usually advisable to lock the SGA ...

  2. swiftTools

    String+Exten.swift // // String+Exten.swift // swiftTest // // Created by napiao on 15/11/27. // Cop ...

  3. 【set&&sstream||floyed判环算法】【UVa 11549】Calculator Conundrum

    CALCULATOR CONUNDRUM Alice got a hold of an old calculator that can display n digits. She was bored ...

  4. PHP.INI常用设置一览表(持续更新)

    在编程的过程中遇到或发现的问题,会持续的更新: 1. 打破var_dump的显示瓶颈 php开发环境里,安装了xdebug模块后,var_dump()输出的结果将比较易于查看,但默认情况下,var_d ...

  5. Foundation--NSArray+NSMutableArray

    C语言中数组只能存放一种类型 OC语言中数组可以存放多种类型,但是只能是对象类型,不可以是基本类型 我们实际中最好在一个数组中只存放一种类型的元素 nil表示数组的结尾,所以我们不能填写值为nil的对 ...

  6. 今天进行了一次IOS面试,分享一下面试结果

    IOS开发工程师岗位职责:1.负责移动产品IOS版客户端软件开发:2.可根据需求独立完成客户端软件的设计和开发;3.日常工作包括手机软件系统开发.单元测试.维护以及文档编写:不定期的公司内部培训.任职 ...

  7. ASP.NET MVC 自定义错误页面心得

    自定义错误页面的目的,就是为了能让程序在出现错误/异常的时候,能够有较好的显示体验. 所以,首先要先了解,我们可以在哪里捕获异常. 当程序发生错误的时候,我们可以在两个地方捕获: Global里面的A ...

  8. margin-top失效及解决办法

    现象:当两个空的块级元素嵌套时,如果内部的块设置有margin-top属性,而且父元素没有下边解决方法所述的特征,那么内部块的margin-top属性会绑架父元素(即将margin-top传递凌驾给了 ...

  9. 初学swift笔记 方法(九)

    import Foundation /* 方法 */ //实例方法 一定需要依附于对象 class MyPoint { var x: Double = 0.0 var y: Double = 0.0 ...

  10. 1 起步-Pro Git---VCS比较、git基本原理、git配置

    本地版本控制系统 集中化的版本控制系统 诸如 CVS,Subversion 以及 Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务 ...