IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> spring底层核心原理详解 -> 正文阅读

[Java知识库]spring底层核心原理详解

一,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;
	}
}
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-09-21 00:12:55  更:2022-09-21 00:14:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:13:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码