第16集 refresh()-prepareBeanFactory分析
【视频来源于:B站up主孙帅suns Spring源码视频】
1、设置类加载器
 
2、设置SpringEL表达式 解析器

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

3.1、如何实现类型转化?
1、Converter
2、PropertyEditor
3.2、环境变量设置的技巧
环境变量设置classPath,如果不讲究就直接以当前目录作为类路径,实际上Java大量的java工具都在rt.jar,这样检索起来效率更高。
3.3、PropertyEditor类型转换器的实践
 
- 1、继承PropertyEditorSupport
 - 2、如何获得日期?
 - 3、谁调用谁传参
 - 4、拿到文本进行设置值,成功转换。
 - 5、怎么把转换好的数据交给Customer的birthday属性? 
  
- 5.1、super.setValue(d)
 -  
  
 - 6、告诉Spring 
  
 -  
 
3.4、为什么通过super.setValue就可以将值交给Spring呢?表达的真正含义是什么呢?
存到了PropertyEditorSupport的value属性,getValue就可以取
 
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内置的属性转换器
 Stirng-》Class
 String-》IO
 String-》Integer
3.7、Converter实践
Spring的Converter主要用于将一个类型的对象转化为另一个类型的对象,常见的应用场景是在Web应用中进行属性绑定。
Converter提供了两个方法,分别是convert和canConvert。其中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的形式注入,那么就会失效。
 
 
5、进行接口类型与 实现对象的配对
 
6、内部事件监听处理
 
7、处理资源系统参数
 
- Environment 可以替换信息${name}->替换成配置文件信息 
  
- .property ----> ${name}
 
 - SystemProperty —> 获得系统参数等信息 
  
- OS
 - 位数…
 
 
8、prepareBeanFactory总结
 
 


















