spring
Framework
- spring-framework github.com/spring-proj…
- spring io spring.io/
Container- core
- bean
- conetxt
- SpEL
- DataAccess
- jdbc
- orm
transactions
- Web
- web
- webflux
- websocket
- AOP,aspsects
- Event,Messaging
IOC
IOC是spring管理Bean生命周期的一种设计思想,DI是实现的方式(构造/setter)
IOC-DI
- 读取bean的配置信息,在spring容器中缓存bean的
配置表 - 根据
注册表实例化bean - 将实例化完成的bean,设置对象属性,转存bean
实例表缓存(Map) - DI,应用从缓存(
hashMap)获取指定bean
BeanFactory
BeanFactory是spring容器本身的基本架构,ApplicationContext面向框架的封装的context
BeanDefinitionRegistry,注册BeanDefination(描述Bean的声明信息)BeanFactory, 顶层接口,getBean()接口获取beanListableBeanFactory,Bean基本信息HierarchicalBeanFactory,建立父子容器的级联关系ConfigurableBeanFactoryAutowireCapableBeanFactory, 自动装配beanSingletonBeanRegistry,运行期间注册单例beanDefaultSingletonBeanRegistry,提供缓存单例Bean的缓存(HashMap)ApplcationContext, 三个重要的父类
ApplicationContext
ClassPathXmlApplicationContext,类路径加载FileSystemXmlApplicationContext,文件系统加载ApplicationEventPublisher,发布订阅事件ResourcePatternResolver,PathMatchingResourcePatternResolver解析配置文件WebApplicationContext,提供ServletContext,加载web根目录
Bean作用域
bean-scope就4个
<bean id=".." class="..." scope="singleton"/>
<!--1,2是Application默认支持的2中-->
- singleton: 注意线程安全,无状态使用
- prototype(原生类型): 每次都会创建新的实例
- request:只在一次HttpRequest请求中有效
- session:会话期间
- global-session(spring5已经废弃)
1,2是Spring提供的;3,4,5是MVC扩展的
bean生命周期
// 1. @PostConstruct, @PreDestroy
// 2. implements InitializingBean,DisposableBean
// 3. @Bean(initMethod = "start", destroyMethod = "destroy")
// 4. implements ApplicationContextAware
// 5. implements BeanPostProcessor
AOP
AOP(Aspect-Oriented Programming)面向切面编程,OOP( Object-Oriented Programming面向对象编程),在OOP中, 我们以类(class)作为基本单元,而 AOP中的基本单元是Aspect(切面)
AspectJ是一种使用Java注解来实现AOP框架,
Spring AOP就是基于动态代理,(JDK,CGlib)
多态:通过接口-继承实现不同的功能,接口引用的实例对象和引用调用的接口在实际运行时才能确定。编译时不能确定。
dubbo 很多代理方式使用的字节码编译=>对比动态代理的实现
JDK-Cglib
Jdk
- 目标类必须实现某接口,getInterfaces()不能为null
- 代理类与目标类的关系是has(依赖)关系
- InvocationHandler,Proxy.newProxyInstance
- 通过接口系统解耦方便(运行加载指定的实例)
CGlib
- 1.基于asm原理,基于对class字节码修改,生成代理子类,代理类是目标类的继承,是继承关系
- 2.方法必可继承,不能private, final
- 3.MethodInterceptor,Enhancer.create(); 代理对象更加广
//使用的类注入: 只支持cglib代理
@Autowired
HelloServiceImpl helloService;
//使用的接口注入:支持jdk,cglib代理
@Autowired
HelloService helloService;
//jdk支持接口代理,cglib支持类和接口代理
//源代码
spring-jdk代理实现类JdkDynamicAopProxy
Spring-cglib代理实现类CgLibCommonProxy
spring处理代理的aware类的方法:
使用误区: but was actually of type 'com.sun.proxy.$Proxy37'
design-pattern
- Factory: BeanFactory
- Proxy AOP的动态代理
- 单例
- 模版
transasction
事务隔离级别(对应数据库的四个级别+数据库默认级别)
- TransactionDefinition.ISOLATION_DEFAULT
- TransactionDefinition.ISOLATION_READ_UNCOMMITTED
- TransactionDefinition.ISOLATION_READ_COMMITTED
- TransactionDefinition.ISOLATION_REPEATABLE_READ
- TransactionDefinition.ISOLATION_SERIALIZABLE
事务传播行为(事务重新利用的方式)
支持当前事务的情况:
TransactionDefinition.PROPAGATION_REQUIRED: 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。- TransactionDefinition.PROPAGATION_SUPPORTS: 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
- TransactionDefinition.PROPAGATION_MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(mandatory:强制性)
不支持当前事务的情况:
- TransactionDefinition.PROPAGATION_REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则把当前事务挂起。
- TransactionDefinition.PROPAGATION_NOT_SUPPORTED: 以非事务方式运行,如果当前存在事务,则把当前事务挂起。
- TransactionDefinition.PROPAGATION_NEVER: 以非事务方式运行,如果当前存在事务,则抛出异常。
其他情况:
- TransactionDefinition.PROPAGATION_NESTED: 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。
keys
-
spring 循环依赖怎么解决(说出三级缓存源码细节)
-
spring aop原理(动态代理)
-
spring bean生命周期(源码细节,以及各个位置的设计思路,有什么可扩展的)
-
AOP源码
-
IOC源码
-
[大神源码]javadoop.com/