上次我介绍了一下ASM大概情况请参见ASM详解
接着上次说得的我会介绍ASM在Spring中的一些使用,接触过spring的朋友都应该接触过ClassPathXmlApplicationContext或FileSystemXmlApplicationContext,他们都是加载spring配置文件形成spring应用上下文的类。
下面是ClassPathXmlApplicationContext与FileSystemXmlApplicationContext类关系。
AbstractApplicationContext
/|\
|
AbstractRefreshableApplicationContext
/|\
|
AbstractRefreshableConfigApplicationContext
/|\
|
AbstractXmlApplicationContext
/|\ /|\
| |
ClassPathXmlApplicationContext FileSystemXmlApplicationContext
在spring中设置扫描annotation的语句是:<context:component-scan base-package="com.appspot.coder9527.joinhack">,这样容器在启动的时候就会去扫描配置包对应的类,查看是否有annotation,如果有annotation的配置,spring容器就会根据annotation的描述完成bean的配置。在上述过程中使用到ASM的地方就是AbstractRefreshableApplicationContext的refreshBeanFactory方法,refreshBeanFactory方法调用loadBeanDefinitions方法完成bean定义loadBeanDefinitions中会调用XmlBeanDefinitionReader类的loadBeanDefinitions加载bean的定义.在这个过程中会调用到NamespaceHandlerSupport的parse方法,该方法通过配置寻找到对应的BeanDefinitionParser,上述的配置中spring会使用ComponentScanBeanDefinitionParser来完成bean定义,下面是ComponentScanBeanDefinitionParser的实现代码.
public BeanDefinition parse(Element element, ParserContext parserContext) {
String[] basePackages = StringUtils.tokenizeToStringArray(element.getAttribute(BASE_PACKAGE_ATTRIBUTE),
ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS);
// Actually scan for bean definitions and register them.
ClassPathBeanDefinitionScanner scanner = configureScanner(parserContext, element);
Set<BeanDefinitionHolder> beanDefinitions = scanner.doScan(basePackages);
registerComponents(parserContext.getReaderContext(), beanDefinitions, element);
return null;
}
在上述实现中值得注意的是ClassPathBeanDefinitionScanner类就是来扫描ClassPath中指定包对应的bean,在doScan方法中可以看到找到findCandidateComponents方法通过MetadataReaderFactory创建类的MetadataReader使用,MetadataReader来读取annotation,下面是MetadataReader的类结构。
MetadataReader
/|\
|
SimpleMetadataReader
ClassPathBeanDefinitionScanner中扫描所有的Class文件,使用SimpleMetadataReader获得ClassMetadata信息,下面是SimpleMetadataReader的代码.
final class SimpleMetadataReader implements MetadataReader {
private final Resource resource;
private final ClassMetadata classMetadata;
private final AnnotationMetadata annotationMetadata;
SimpleMetadataReader(Resource resource, ClassLoader classLoader) throws IOException {
InputStream is = resource.getInputStream();
ClassReader classReader = null;
try {
classReader = new ClassReader(is);
} finally {
is.close();
}
AnnotationMetadataReadingVisitor visitor = new AnnotationMetadataReadingVisitor(classLoader);
classReader.accept(visitor, true);
this.annotationMetadata = visitor;
// (since AnnotationMetadataReader extends ClassMetadataReadingVisitor)
this.classMetadata = visitor;
this.resource = resource;
}
public Resource getResource() {
return this.resource;
}
public ClassMetadata getClassMetadata() {
return this.classMetadata;
}
public AnnotationMetadata getAnnotationMetadata() {
return this.annotationMetadata;
}
}
到这里为止我们可以看到ASM相关代码ClassReader和Vistor。有兴趣的朋友可以继续读相关的源码。
分享到:
相关推荐
spring 3.2.5版本源码使用的,构建的时候使用如下描述 因为英文不太好,大概意思可能是什么asm4.0版本使用的spring 在spring4中已经重新包装了asm在spring-core的核心包里,当然我这解释不标准 看下满原文构建的描述...
二、Spring中的ASM应用 1. 动态代理:Spring AOP利用ASM生成代理类,实现对目标对象的方法拦截。当一个类需要被代理时,Spring会使用ASM生成一个该类的子类,然后在这个子类中加入拦截逻辑,这样就实现了方法的动态...
在本案例中,标题和描述提到的"Spring源码导入Eclipse缺失Jar包spring-asm-repack-5.0.4+spring-cglib-repack-3.1",意味着在进行Spring源码研究时,Eclipse缺少了这两个关键的库文件。 首先,我们需要了解ASM...
编译完spring3.2.18源码发现缺少spring-asm-repack-5.0.4.jar,spring-cglib-repack-3.1.jar 两个jar,网上找了很久都没找到能用的,这是我下载发行版,自己打的JAR,可以正常使用
这是spring-asm-3.1.0.RELEASE.jar,为了使用方便传上来.
版本号"3.0.6"表明这是ASM的第三个主要版本的第六次次要发布,"RELEASE"则表示这是一个稳定版本,适合在生产环境中使用。Quartz是一个流行的任务调度框架,通常与Spring一起使用,"quartz必备jar包"的描述说明ASM在...
org.springframework.asm-sources-3.0.5.release.jar
org.springframework.asm-3.1.1.RELEASE.jar
为了防止产品代码泄漏或授权等被破解,想到对源码加密,说是对源码加密,...本文讲解的就是SpringWeb项目加密后如何能在tomcat下面启动运行的。 1、war包加密; 2、tomcat类加载器修改; 3、Spring-asm类加载修改;
在Spring中,ASM主要用于AOP(面向切面编程)的实现,通过字节码操作,Spring可以在运行时动态生成代理类,以实现在不修改原有代码的情况下插入切面逻辑。spring-asm-repack-5.0.4.jar是ASM库的一个特定版本,与...
rg.springframework.asm-3.0.1.RELEASE-A.jar
下面将详细解释ASM4及其在JAVA开发中的应用。 首先,ASM4提供了访问和修改Java类和方法的全面API。它允许开发者在运行时动态生成和修改类,甚至可以在类加载到JVM之前或者之后进行操作。这对于AOP(面向切面编程)...
spring相关的jar我这边全都有,要什么版本的可以留言,我上传,这次上传spring-asm-3.1.4.RELEASE.jar
在Java开发中,ASM库允许我们直接操作字节码,这对于理解和实践AOP(面向切面编程)的概念尤其有用,就像Spring框架中的AOP实现。 面向切面编程(AOP)是一种编程范式,它允许程序员定义“切面”,这些切面封装了...
org.springframework.asm-3.0.0.M4.jar
org.springframework.asm-3.1.0.M2
org.springframework.asm-3.0.0.M3.jar
spring-core-4.2.1.RELEASE.jar
org.springframework.asm-3.0.0.RELEASE org.springframework.aspects-3.0.0.RELEASE org.springframework.beans-3.0.0.RELEASE org.springframework.context.support-3.0.0.RELEASE org.springframework.context-...