一、Spring的模块化划分
一共包括20个模块,按照官网的描述,从上到下的排列依次是:
spring-aop:
spring-aspects:
spring-beans:
spring-context-indexer:
spring-context-support
spring-context:
spring-core:
spring-expression:
spring-instrument: javaagent的支持
spring-jcl: 统一日志管理框架
spring-jdbc:
spring-jms: 封装对java的消息机制的支持
spring-messaging:统一消息服务的实现
spring-orm:
spring-oxm: xml的编列
spring-test:
spring-tx: spring的事务抽象
spring-web:
spring-webflux:
spring-webmvc:
spring-websocket:
二、spring的编程模型
2.1 面向对象编程
契约接口:Aware,BeanPostProcessor...
设计模式:观察者模式、组合模式、模板模式
对象继承:Abstract*类
2.2 面向切面编程
动态代理:JdkDynamicAopProxy
字节码提升:ASM,CGLIB,AspectJ
2.3 面向元编程
注解:模式注解(@Component,@Service, @Respository...)
配置:Environment抽象、PropertySources、BeanDefinition..
泛型:GenericTypeResolver、ResolvableType
2.4 函数驱动
函数接口:ApplicationEventPublisher
Reactive: Spring WebFlux
2.5 模块驱动
Maven Artifacts
Spring @Enable*
三、Spring使用者的专属设计模式
3.1前缀模式
3.1.1 Enable模式
3.1.2 Configurable模式
3.2 后缀模式
3.2.1 处理器模式
(1)xxxProcessor
(2)xxxResolver
(3)xxxHanlder
3.2.2 意识模式
xxxAware
3.2.3 配置器模式
xxxConfiguror
3.2.4 选择器模式
xxxImportSelector
四、Spring3.0之前的类型转换、元数据编辑与Java自省机制
4.1 代码示例
public class QuestionnaireInvestigationService {
public static void main(String[] args) throws IntrospectionException {
BeanInfo beanInfo = Introspector.getBeanInfo(QuestionnaireInvestigation.class,Object.class);
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
Arrays.stream(propertyDescriptors).forEach(propertyDescriptor -> {
Class<?> propertyType = propertyDescriptor.getPropertyType();
if (propertyType.getName().equals("age")) {
propertyDescriptor.setPropertyEditorClass(StringToIntegerPropertyEditor.class);
}
});
}
static class StringToIntegerPropertyEditor extends PropertyEditorSupport {
public void setAsText(String text) throws java.lang.IllegalArgumentException {
Integer value = Integer.valueOf(text);
setValue(value);
}
}
}