pring核心概念详解
一,spring底层架构核心概念
1,BeanDefinition
2,BeanDefinitionRead
3,BeanDefinitionScanner
4,BeanDefinitionRegister
5,BeanDefinitionMap
6,BeanFactory
7,ApplicationContext
8,ApplicationContext和BeanFactory区别
9,FactoryBean
10,BeanPostProcessor
11,BeanFactoryPostProcessor
12,ExcludeFilter和IncludeFilter
13,PropertyEditor类型转换器
14,ConversionService类型转换器
一,spring底层架构核心概念 1,BeanDefinition
表示bean定义。所有可以注入spring容器的对象,在注入过程中都会先生成一个beanDefinition,如直接在配置文件中写一个bean标签,也可以通过这种注解@Component,@Value,@Configuration,@Import,@Bean等生成一个bean。
在BeanDefinition的定义中,可以解析一些注解,比如bean的作用域,是懒加载等。
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// 生成一个BeanDefinition对象,并设置beanClass为User.class,并注册到ApplicationContext中
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
beanDefinition.setBeanClass(User.class);
2,BeanDefinitionRead
beanDefinition的一个读取器,主要有AnnotatedBeanDefinitionReader和XmlBeanDefinitionRead两种读取器。主要是去读取context上下文里面的一些类,并会对类上面的一些注解进行解析和读取,如一些@Conditional,@Scope,@Lazy等
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
AnnotatedBeanDefinitionReader annotatedBeanDefinitionReader = new AnnotatedBeanDefinitionReader(context);
// 将User.class解析为BeanDefinition
annotatedBeanDefinitionReader.register(User.class);
3,BeanDefinitionScanner
会对这个beanDefinitionRead读取到的东西进行扫描,扫描某个包路径,对扫描到的类进行解析。比如,扫描到的类上如果存在@Component注解,那么就会把这个类解析为一个BeanDefinition。不是所有的beanDefinitionRead读取到的配置类都是有效的,因此需要进一步的扫描来获取具体的有效的配置类bean
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.refresh();
ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(context);
scanner.scan(“com.zhs”);
System.out.println(context.getBean(“userService”));
4,BeanDefinitionRegister
会将上面扫描的有效的配置类进行一个注册,注册完成之后就生成一个BeanDefinition,最后将这个BeanDefinition存放在一个BeanDefinitionMap里面。
5,BeanDefinitionMap
在生成完BeanDefinition之后,不会立马交给bean工厂进行加载,而是会先加入到这个BeanDefinitionMap里面,最后将BeanDefinitionMap交给BeanFactory进行bean的加载。
6,BeanFactory
它是一个bean工厂的一个父接口,主要职责就是用来生产bean,通过调用getBean的这个方法,实现bean的实例化,属性填充,初始化等一系列操作。并且ApplicationContext也是BeanFactory的一种,ApplicationContext继承了这个BeanFactory,因此这个ApplicationContext的功能比这个BeanFactory更加强大。
无论是创建bean还是获取bean,都是通过这个getBean()的这个方法来实现的
7,ApplicationContext
applicationContext也是一个接口,继承了这个BeanFactory,可以用来加载上下文的资源,获取运行时的一些环境属性,国际化,事件发布等。主要有两个实现类,分别是解析接口的AnnotationConfigApplicationContext和解析xml配置文件的这个ClassPathXmlApplicationContext。
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
ClassPathApplicationContext context = new ClassPathApplicationContext(“xml”);
8,ApplicationContext和BeanFactory区别
1,都有生产bean对象的能力
2,applicationContext可以去指定配置类,直接去扫描就好,实现了扫描器,读取器,监听事件等,可以更好地服务类,而bean过程只是一个没有感情的生产机器,只会用来生产bean,只能通过bean定义来实现
3,ApplicationContext管理了spring的整个生命周期,因此可能加载的东西可能会比较多,在一些资源受限的情况下,BeanFactory可以优先选择
9,FactoryBean
就是说会在这个初始化的阶段,可以生成其他的bean的实例。例如下面的一个OrderService的一个类,再加上这个@Component这个注解之后,应该会向这个容器中注册一个OrderService的一个实例,但是如果实现了这个FactoryBean的这个接口之后,那么可以在这个重写的方法里面,可以向容器中创建一个别的实例,比如说一个UserService的这个实例。
然而这个实例只参与了整个spring生命周期的初始化阶段,像其他的实例化,属性填充等阶段都没有参与。
@Component
public class OrderService implements FactoryBean {
//就是说可以通过这个类返回一个别的对象
@Override
public Object getObject() throws Exception {
UserService userService = new UserService();
return userService;
}
@Override
public Class << ? > getObjectType() {
return UserService.class;
}
}
10,BeanPostProcessor
在bean工厂中创建bean对象时,可以通过这个BeanPostProcessor的bean的后置处理器来做一些扩展,如在bean实例化之前去扫描一些类上面是否存在一些注解,在bean初始化之后去实现AOP等。
11,BeanFactoryPostProcessor
这个和BeanPostProcessor的作用类似,用于作为spring的扩展。而BeanPostProcessor是用来对bean做扩展的,而这个BeanFactoryPostProcessor的bean工厂的后置处理器是对BeanFactory做一些扩展的。
12,ExcludeFilter和IncludeFilter
这两个Filter是Spring扫描过程中用来过滤的 , ExcludeFilter表示排除过滤器,IncludeFilter表示包含过滤器。
在排除过滤器中,如果过滤了某个具体的类,那么这个类就算是加了@Configuration或者Component的注解,也不会将这个实例注册成bean
@ComponentScan(value = “com.zhs”,
excludeFilters = {
@ComponentScan.Filter(
type = FilterType.ASSIGNABLE_TYPE,
classes = UserService.class)
}),
includeFilters = {
@ComponentScan.Filter(
type = FilterType.ASSIGNABLE_TYPE,
classes = UserService.class)
})
public class AppConfig {
}
在spring容器启动时,也是通过这个IncludeFilter来扫描这个@Component的这个注解的。
protected void registerDefaultFilters() {
//主动去扫描类上面有没有这个Component的这个注解
this.includeFilters.add(new AnnotationTypeFilter(Component.class));
}
13,PropertyEditor类型转换器
可以实现类型的转换,比如说将一个String类型转化成一个对象类型。这个为jdk里面自带的一个工具
public class StringToUserPropertyEditor extends PropertyEditorSupport implements PropertyEditor {
@Override
public void setAsText(String text) throws IllegalArgumentException {
User user = new User();
user.setName(text);
this.setValue(user);
}
}
14,ConversionService类型转换器
这个和上面的PropertyEditor类型转换器一样,不过这个为spring里面自带的类型转换器,相对于这个PropertyEditor类型转换器,这个ConversionService的类型转换器的功能更加的强大
public class StringToUserConverter implements ConditionalGenericConverter {
@Override
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
return sourceType.getType().equals(String.class) && targetType.getType().equals(User.class);
}
@Override
public Set < ConvertiblePair > getConvertibleTypes() {<!-- -->
return Collections.singleton(new ConvertiblePair(String.class, User.class));
}
@Override
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {<!-- -->
User user = new User();
user.setName((String) source);
return user;
}
}
作者:答学网,转载请注明原文链接:http://www.dxzl8.com/