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。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值