`
ctxyzhanwei
  • 浏览: 10026 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

Spring注解原理的初步研究

阅读更多
提供自动扫描功能的核心类是:ClassPathBeanDefinitionScanner

使用Classpath扫描机制:第一种是直接使用AnnotationConfigApplicationContext,该类有一个scan(String
basePackages)方法,可以对指定的包进行扫描

1.配置需要扫描的类;

2.在需要被纳入Spring容器的类上加上相应的注解;

3.Spring在类路径下寻找标注了注解的类,并把这些类纳入Spring容器中管理。


读取配置文件,获取配置的包路径。根据包路径,获取包下所有的class对象,通过getAnnotion()方法,判断是否有注解且注解的类型是否在过滤规则中存在,若通过过滤则存放到spring容器中,

提供自动扫描功能的核心类是:ClassPathBeanDefinitionScanner,该类根据提供个基础包名,扫描classpath下与该包名的路径下,找到复合条件的类并注册为Spring的一个Bean。


很早之前,为了简化配置信息,自己写了一坨代码,基于classpath扫描类信息,加载.
其实,在spring中,已经提供了类似组件(后知后觉了...):

org.springframework.core.io.support.PathMatchingResourcePatternResolver  资源解析器(基于路径的正则表达式)
org.springframework.core.type.classreading.MetadataReader ClassMeta信息解读器
public class Test {
 
      /* 资源路径 */
      private static final String                  PATH           = "classpath*:com/alibaba/javalab/t*/**/*.class";
      /* 资源解析器 */
      private static final ResourcePatternResolver RESOLVER       = new PathMatchingResourcePatternResolver();
     /* Meta信息Reader Factory.用于创建MetaReader */
     private static final MetadataReaderFactory   READER_FACTORY = new SimpleMetadataReaderFactory();
 
     public static void main(String[] args) throws Exception {
         //根据正则表达式,得到资源列表
         Resource[] resources = RESOLVER.getResources(PATH);
         for (Resource res : resources) {
             //通过 MetadataReader得到ClassMeta信息,打印类名
             MetadataReader meta = READER_FACTORY.getMetadataReader(res);
             System.out.println(meta.getClassMetadata().getClassName());
         }
     }
}


基于struts2 的自动扩展插件:
扩展方式为:jar文件加上配置文件中的相关配置.
扩展原理为:
struts2启动配置,开始分析FiterDispatcher过滤类:
获取默认的参数创建dispacher对象,在对dispacher对象的一系列初始化工作中,读取系统配置文件以及用户自定义的配置文件。在读取xml配置文件时,根据用户配置的名称(如果没有,则采用系统默认的struts-default.xml,struts-plugin.xml,struts.xml三个名称),利用配置管理器对象,来加载项目中的xml配置文件,加载过程如下:
通过ClassLoader类中的getResources()方法,获取项目中所有与名称相匹配的文件,并采用DOM方式解析xml,对xml文件中的每个<bean>元素,获取type,name,class,static,scope,optional这些属性,针对每个属性的值做相应的处理,将属性提交给struts管理容器注册,最后注入bean。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics