本文转自http://blog.sina.com.cn/s/blog_4cb8215f0100d10b.html,但为方便,稍有更改
使用自定义annotation完成注入
第一步:编写待注入类以及需要被注入类
**************************************************************
public class UserDAO {
public UserDAO() {
}
public void saveUser(String userName) {
System.out.println("保存"+userName);
}
}
**************************************************************
public class UserService{
private UserDAO userDao=null;
public void setUserDao(UserDAO userDao) {
this.userDao = userDao;
}
public void save(String name) {
userDao.saveUser(name);
}
}
第二步:编写自定义的annotation @Resource
@Retention(RetentionPolicy.RUNTIME) //运行期可用
@Target({ElementType.FIELD,ElementType.METHOD}) //可以在属性或者方法中使用
public @interface Resource {
public Class classType() ;
}
第三步:使用@Resource. 使用@Resource将DAO注入到Service中
public class UserServiceImpl implements UserService {
private UserDAO userDao=null;
@Resource(classType=UserDAO.class)
public void setUserDao(UserDAO userDao) {
this.userDao = userDao;
}
public void save(String name) {
userDao.saveUser(name);
}
}
现在在userService类中使用了@Resource,它什么也做不了,并不能完成注入。它必须要有处理器来对这个annotation进行处理
第四步:编写处理器.
public class AnnotationTest {
public static void injectObject(Object obj) { if (obj != null) { try { BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass()); // 取得所有的属性 PropertyDescriptor[] propertys = beanInfo .getPropertyDescriptors();
for (PropertyDescriptor propertyDescriptor : propertys) { // 取得setter方法 Method setter = propertyDescriptor.getWriteMethod(); if (setter != null) { // 判断该属性是否使用了@Resource if (setter.isAnnotationPresent(Resource.class)) { Resource resource = setter .getAnnotation(Resource.class); Class cls = resource.classType(); // 实例化被注入对象 Object target = cls.newInstance(); // 调用setter方法,完成注入 setter.invoke(obj, target); } } }
} catch (Exception e) { e.printStackTrace(); } } }
java.beans.Introspector类为通过工具学习有关受目标 Java bean 支持的属性、事件和方法的知识提供了一个标准方法。 (其所有属性、公开的方法和事件)
java.beans.PropertyDescriptor描述 Java Bean 通过一对存储器方法导出的一个属性,包括setReadMethod(Method readMethod) /setWriteMethod(Method writeMethod) 设置应该用于读取/写入属性值的方法
public class SimpleBeanInfo extends Object implements BeanInfo 提供 BeanInfo 类更容易的支持类 |