书接上文
今天是BeanDI注解的使用 以及怎么书写一个好的程序。
@BeanDI
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@BeanDI注解 可以放在set方法上面作为注解 也可以放在属性上面。
在此我们放在成员变量上面进行展示:
那么相应的beanFactory中应该添加方法来解析这个注释
public static void resolveFieldAnnotation(Object beanInstance){
Field[] fields=beanInstance.getClass().getDeclaredFields();
for(Field field:fields){
if(null!=field&&field.isAnnotationPresent(BeanDI.class)){
BeanDI bd=field.getAnnotation(BeanDI.class);
String beanId=bd.name();
Object value="";
if(beanId!=null&&"".equals(beanId)){
value=singletonBeanMap.get(beanId);
}else{
for(String key:singletonBeanMap.keySet()){
if(field.getType().isAssignableFrom(singletonBeanMap.get(key).getClass())){
value=singletonBeanMap.get(key);
break;
}
}
}
field.setAccessible(true);
try {
//beaninstance当前对象 value表示注入的值
//对带有注解的属性初始化 使用set方法
field.set(beanInstance, value);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static void resolvePropertyAnnotation(Object beanInstance){
try {
/**
* 拆分成多行代码:
* 1.更容易看中间过程
* 2.异常定位
* 3.变量接受返回值重复利用
*/
BeanInfo beanInfo=Introspector.getBeanInfo(beanInstance.getClass());
PropertyDescriptor[] pdArray= beanInfo.getPropertyDescriptors();
for(PropertyDescriptor pd:pdArray){
/**
* PropertyDescriptor:getwritr获取set方法
* getreadmethod获取get方法
*/
Method setter = pd.getWriteMethod();
//setter方法注解 不用注解会遍历 效率降低
if(null!=setter && setter.isAnnotationPresent(BeanDI.class)){
BeanDI bd=setter.getAnnotation(BeanDI.class);
String name="";
Object value="";
if(bd.name()!=null&&!"".equals(bd.name())){
name=bd.name();
//获得注解的实例
value=singletonBeanMap.get(name);
}else{
for (String beanId : singletonBeanMap.keySet()) {
if (pd.getPropertyType().isAssignableFrom(singletonBeanMap.get(beanId).getClass())){
value = singletonBeanMap.get(beanId);
break;
}
}
}
setter.setAccessible(true);
setter.invoke(beanInstance, value);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}