第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
- 位数…