使用自定义annotation完成注入

本文转自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 类更容易的支持类
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值