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