通俗的理解,spring其实是帮我们创建了类实例对象,称为spring bean,并且统一管理了一个个的bean,那么spring怎么去注册bean呢,在bean很多的情况下又该如何注册
在spring的内部有两个类一个是 AnnotatedBeanDefinitionReader 一个是 ClassPathBeanDefinitionScanner
AnnotatedBeanDefinitionReader 给我们提供了注册Bean的功能
ClassPathBeanDefinitionScanner 提供了扫描某一路径下所有bean的功能
在AnnotationConfigApplicationContext的构造器中就会实例化这两个bean
public AnnotationConfigApplicationContext() {
this.reader = new AnnotatedBeanDefinitionReader(this);
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
从上面的分析,其实context具备注册bean的功能,那么我们其实可以编程式的注册一个bean也是可以,例如
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(UserBean.class);
context.refresh();
UserBean bean = context.getBean(UserBean.class);
System.out.println(bean);
}
输出
com.shura.beans.UserBean@123a439b
从上面分析,context还具备扫描的功能,可以指定路径扫描bean注册,例如
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.refresh();
context.scan("com.shura.beans");
UserBean bean = context.getBean(UserBean.class);
System.out.println(bean);
}
输出
com.shura.beans.UserBean@626b2d4a
spring就是利用了Reader以及Scanner去知道要实例化注册哪些Bean的,在我们的编程中往往是通过ComponentScan注解来做到扫描注册bean,下一篇我们将介绍spring通过ComponentScan注册bean的源码
欢迎关注,学习不迷路!