前言
在工作中经常使用Spring的相关框架,免不了去看一下Spring的实现方法,了解一下Spring内部的处理逻辑。特别是开发Web应用时,我们会频繁的定义@Controller,@Service等JavaBean组件,通过注解,Spring自动扫描加载了这些组件,并提供相关的服务。
Spring是如何读取注解信息,并注入到bean容器中的,本文就是通过嵌入Spring的Bean加载,来描述Spring的实现方法。完整的例子都在Github上了。
自定义注解
先看一个最简单的例子,在使用SpringWeb应用中的过程中,大家免不了会使用@Controller,@Service,@Repository等注解来定义JavaBean。那么怎么自己定义一个注解,Spring可以自动加载呢。所以就有了第一个例子。
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface MyComponent {
String value() default
"";
}
@Configuration
public class ComponentAnnotationTest {
public static void main(String[] args)
{
AnnotationConfigApplicationContext
annotationConfigApplicationContext = new
AnnotationConfigApplicationContext();
annotationConfigApplicationContext.register(ComponentAnnotationTest.class);
annotationConfigApplicationContext.refresh();
InjectClass injectClass
=
annotationConfigApplicationContext.getBean(InjectClass.class);
injectClass.print();
}
@MyComponent
public static class InjectClass {
public void print()
{
System.out.println("hello world");
}
}
}
运行这个例子,就会发现,@MyComponent
注解的类,也被Spring加载进来了,而且可以当成普通的JavaBean正常的使用。查看Spring的源码会发现,Spring是使用ClassPathScanningCandidateComponentProvider扫描package,这个类有这样的注释
A component provider that scans the classpath from a base
package.
It then applies exclude and include filters to the resulting
classes to find candidates.
这个类的 registerDefaultFilters 方法有这样几行代码
protected void registerDefaultFilters() {
this.includeFilters.add(new
AnnotationTypeFilter(Component.class));
ClassLoader cl =
ClassPathScanningCandidateComponentProvider.class.getClassLoader();
try {
this.includeFilters.add(new AnnotationTypeFilter(((Class
分享:
喜欢
0
赠金笔
加载中,请稍候......
评论加载中,请稍候...
发评论
登录名: 密码: 找回密码 注册记住登录状态
昵 称:
评论并转载此博文
发评论
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。