spring注解实现原理
转载:https://zxf-noimp.iteye.com/blog/1071765
注解处理器ClassPathXMLApplicationContext主要方法有三个:
public ClassPathXMLApplicationContext(String fileName) {
//读取配置文件中管理的bean
this.readXML(fileName);
//实例化bean
this.instancesBean();
//注解处理器
this.annotationInject();
}
一. readXML(String fileName);
1. new ClassPathXMLApplicationContext( "configAnnotation.xml")方式获取配置文件;
- 然后遍历文件中的标签元素,得到beanList.;
- 通过中属性"id","class"获取关键信息,定义BeanDefine 类;
二. instancesBean();
遍历beaList实例化Bean
三. annotationInject();
- 处理在set方法加入的注解 :propertyAnnotation(Object bean)方法
public void propertyAnnotation(Object bean){ try { //获取其属性的描述 PropertyDescriptor[] ps = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors(); for(PropertyDescriptor proderdesc : ps){ //获取所有set方法 Method setter = proderdesc.getWriteMethod(); //判断set方法是否定义了注解 if(setter!=null && setter.isAnnotationPresent(ZxfResource.class)){ //获取当前注解,并判断name属性是否为空 ZxfResource resource = setter.getAnnotation(ZxfResource.class); String name =""; Object value = null; if(resource.name()!=null&&!"".equals(resource.name())){ //获取注解的name属性的内容 name = resource.name(); value = sigletions.get(name); }else{ //如果当前注解没有指定name属性,则根据类型进行匹配 for(String key : sigletions.keySet()){ //判断当前属性所属的类型是否在配置文件中存在 if(proderdesc.getPropertyType().isAssignableFrom(sigletions.get(key).getClass())){ //获取类型匹配的实例对象 value = sigletions.get(key); break; } } 在这里插入代码片 } //允许访问private方法 setter.setAccessible(true); //把引用对象注入属性 setter.invoke(bean, value); } } } catch (Exception e) { log.info("set方法注解解析异常.........."); } }
- 处理字段上的注解:fieldAnnotation(Object bean)方法
public void fieldAnnotation(Object bean){ try { //获取其全部的字段描述 Field[] fields = bean.getClass().getFields(); for(Field f : fields){ if(f!=null && f.isAnnotationPresent(ZxfResource.class)){ ZxfResource resource = f.getAnnotation(ZxfResource.class); String name =""; Object value = null; if(resource.name()!=null&&!"".equals(resource.name())){ name = resource.name(); value = sigletions.get(name); }else{ for(String key : sigletions.keySet()){ //判断当前属性所属的类型是否在配置文件中存在 if(f.getType().isAssignableFrom(sigletions.get(key).getClass())){ //获取类型匹配的实例对象 value = sigletions.get(key); break; } } } //允许访问private字段 f.setAccessible(true); //把引用对象注入属性 f.set(bean, value); } } } catch (Exception e) { log.info("字段注解解析异常.........."); } }