Java反射及依赖注入简单模拟

一、编写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

时间: 2024-10-16 07:59:20

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

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

Spring依赖注入 --- 简单使用说明 本文将对spring依赖注入的使用做简单的说明,enjoy your time! 1.使用Spring提供的依赖注入 对spring依赖注入的实现方法感兴趣的同学可以参考我的日志:http://www.cnblogs.com/kodoyang/p/Frame_Imitate_Spring.html 我们会用spring提供的ClassPathXmlApplicationContext实现来代替这篇日志中相应的实现 为导入的jar文件配置api 对应的L

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

依赖注入 在一个类中经常会依赖于其他的对象,先看一下经典的写法 class Foo { public $bar; public function __construct() { $this->bar = new Bar(); } } $foo = new Foo(); 当类的依赖发生改变时,比如 Bar 这个类需要实例化参数时,而依赖于它的类有很多,总不能一个一个地去修改吧. 再看一下使用 依赖注入 怎么做 class Foo { public $bar; public function __c

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

Spring对于Bean的依赖注入,支持多种注解方式: @Resource javax.annotation JSR250 (Common Annotations for Java) @Inject javax.inject JSR330 (Dependency Injection for Java) @Autowired org.springframework.bean.factory Spring 直观上看起来,@Autowired是Spring提供的注解,其他几个都是JDK本身内建的注解,

[javascript] 反射与依赖注入!

对于javascript中的反射的理解,一直都是认为,利用数组对回调函数进行保存,之后在适当的时刻利用call或是apply 方法,对回调进行调用即可,一般如下操作: 首先定义两个方法: var service = function() { return { name: 'Service' }; } var router = function() { return { name: 'Router' }; } 我们有另一个函数需要用到这两个模块. var doSomething = functio

go 依赖注入 简单 例子

go 依赖注入 库 利用库 github.com/facebookgo/inject 例子 package main import ( "fmt" "github.com/facebookgo/inject" ) type DBEngine struct { Name string } type UserDB struct { Db *DBEngine `inject:""` } type UserService struct { Db *Use

Android依赖注入Dagger的使用和源码解析(上篇)

一.基本概念 依赖注入(DI)和控制反转(IOC): 依赖注入是从应用程序的角度在描述,可以把依赖注入描述完整点:应用程序依赖容器创建并注入它所需要的外部资源:而控制反转是从容器的角度在描述,描述完整点:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源. 使用依赖注入可以带来以下好处: 依赖的注入和配置独立于组件之外. 因为对象是在一个独立.不耦合的地方初始化,所以当注入抽象方法的时候,我们只需要修改对象的实现方法,而不用大改代码库. 依赖可以注入到一个组件中:我们可以注入这

依赖注入那些事儿

from:http://www.cnblogs.com/leoo2sk/archive/2009/06/17/1504693.html 目录 目录 1 IGame游戏公司的故事 1.1 讨论会 1.2 实习生小李的实现方法 1.3 架构师的建议 1.4 小李的小结 2 探究依赖注入 2.1 故事的启迪 2.2 正式定义依赖注入 3 依赖注入那些事儿 3.1 依赖注入的类别 3.1.1 Setter注入 3.1.2 Construtor注入 3.1.3 依赖获取 3.2 反射与依赖注入 3.3 多

C# 依赖注入

http://www.cnblogs.com/leoo2sk/archive/2009/06/17/1504693.html 这篇文章真的非常非常好···绝对值得收藏学习. 目录 目录 1 IGame游戏公司的故事 1.1 讨论会 1.2 实习生小李的实现方法 1.3 架构师的建议 1.4 小李的小结 2 探究依赖注入 2.1 故事的启迪 2.2 正式定义依赖注入 3 依赖注入那些事儿 3.1 依赖注入的类别 3.1.1 Setter注入 3.1.2 Construtor注入 3.1.3 依赖获

Android开发中依赖注入的应用

什么是依赖注入? 依赖是指一个对象持有其他对象的引用.依赖注入则是将这些依赖对象传递给被依赖对象,而不是被依赖对象自己创建这些对象. public class MyClass{ private AnotherClass mAnotherObject; public MyClass(){ mAnotherObject = new AnotherClass(); } } 通过传递对象的方式,所传递对象的更改不会影响代码. public class MyClass{ private MyInterfa