孙哥Spring源码第16集

第16集 refresh()-prepareBeanFactory分析

【视频来源于:B站up主孙帅suns Spring源码视频】【微信号:suns45】

1、设置类加载器

孙哥Spring源码第16集_第1张图片

2、设置SpringEL表达式 解析器

孙哥Spring源码第16集_第2张图片

3、设置内置的属性编辑器 (类型转换器)

孙哥Spring源码第16集_第3张图片

3.1、如何实现类型转化?

1、Converter

2、PropertyEditor

3.2、环境变量设置的技巧

环境变量设置classPath,如果不讲究就直接以当前目录作为类路径,实际上Java大量的java工具都在rt.jar,这样检索起来效率更高。

3.3、PropertyEditor类型转换器的实践

孙哥Spring源码第16集_第4张图片
  • 1、继承PropertyEditorSupport
  • 2、如何获得日期?
  • 3、谁调用谁传参
  • 4、拿到文本进行设置值,成功转换。
  • 5、怎么把转换好的数据交给Customer的birthday属性?
    • 5.1、super.setValue(d)
    • 孙哥Spring源码第16集_第5张图片
  • 6、告诉Spring
    • 孙哥Spring源码第16集_第6张图片

3.4、为什么通过super.setValue就可以将值交给Spring呢?表达的真正含义是什么呢?

存到了PropertyEditorSupport的value属性,getValue就可以取

孙哥Spring源码第16集_第7张图片

3.5、Java世界接口实现类的几种命名方式

1、UserDao->UserDaoImpl

2、IUserDao->UserDao

3、ApplicationContext,ClassPathXmlApplicationContext

4、FactoryBean,SqlSessionFatoryBean

5、PropertyEditor、PropertyEditorSupport

6、Action、ActionSupport

3.6、字符串为什么能给Class属性注入呢?

孙哥Spring源码第16集_第8张图片 孙哥Spring源码第16集_第9张图片

Spring内置的属性转换器
Stirng-》Class
String-》IO
String-》Integer

3.7、Converter实践

Spring的Converter主要用于将一个类型的对象转化为另一个类型的对象,常见的应用场景是在Web应用中进行属性绑定。

Converter提供了两个方法,分别是convertcanConvert。其中convert方法用于执行转化操作,接收两个参数,一个是原始对象(即需要转化的对象),另一个是目标类,表示需要将原始对象转化为目标类的实例。canConvert方法则是用于检查是否支持某个类型的转化,其接收一个源类型和目标类型,返回true或false。

下面是一个使用Converter的示例代码:

public class MyConverter implements Converter<String, MyObject> {

    @Override
    public MyObject convert(String source) {
        // 将字符串source转化为MyObject对象
        MyObject myObject = new MyObject();
        myObject.setXXX(source.getXXX());
        // ...
        return myObject;
    }

    @Override
    public boolean canConvert(Class<?> sourceType, Class<?> targetType) {
        // 检查是否支持将sourceType转化为targetType
        if (sourceType == String.class && targetType == MyObject.class) {
            return true;
        }
        return false;
    }

}

在上面的示例中,我们定义了一个名为MyConverter的Converter,在其中实现了convert和canConvert方法。canConvert方法检查源类型是否为String类型,目标类型是否为MyObject类型。如果是,则说明支持将String类型的数据转化为MyObject类型的数据;否则不支持。

下面是如何在Spring中注册和使用这个Converter:

@Configuration
public class MyConverterConfig {

    @Bean
    public ConversionService conversionService() {
        DefaultConversionService conversionService = new DefaultConversionService();
        conversionService.addConverter(new MyConverter());
        return conversionService;
    }

}

@RestController
public class MyController {

    @Autowired
    private ConversionService conversionService;

    @PostMapping("/my-url")
    public void myMethod(@RequestParam("param") MyObject param) {
        // 处理传入的MyObject对象
    }

4、通过BeanPostProcessor处理Aware

  • 创建一个ApplicationContextAwareProcessor
    对如下Ware进行添加这个对象
  • EvnriromentAware、ApplicationContextAware… 时机 不在工厂启动的时候操作,而是创建对象的第三步初始化中通过BeanPostProcessor完成
  • 不要在工厂启动的时候 注入这些Aware 而是在对象创建的时候在注入,default-autowired = byName byType 都不会产生任何的问题,但是 construstor,如果不放入BeanPostProcessor处理的话,对象实现Aware接口都是以set的形式注入,那么就会失效。
孙哥Spring源码第16集_第10张图片

5、进行接口类型与 实现对象的配对

孙哥Spring源码第16集_第11张图片

6、内部事件监听处理

孙哥Spring源码第16集_第12张图片

7、处理资源系统参数

孙哥Spring源码第16集_第13张图片
  • Environment 可以替换信息${name}->替换成配置文件信息
    • .property ----> ${name}
  • SystemProperty —> 获得系统参数等信息
    • OS
    • 位数…

8、prepareBeanFactory总结

孙哥Spring源码第16集_第14张图片

你可能感兴趣的:(spring,python,java)