spring-bean-1

74 阅读4分钟

spring

spring

Framework

spring4_x.png

  • 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

  1. 读取bean的配置信息,在spring容器中缓存bean的配置表
  2. 根据注册表实例化bean
  3. 将实例化完成的bean,设置对象属性,转存bean实例表缓存(Map)
  4. DI,应用从缓存(hashMap)获取指定bean

Spring-ioc.jpeg

bean_lifetime.jpg

BeanFactory

BeanFactory是spring容器本身的基本架构,ApplicationContext面向框架的封装的context

spring-beanFactory.jpeg

  1. BeanDefinitionRegistry,注册BeanDefination(描述Bean的声明信息)
  2. BeanFactory, 顶层接口,getBean()接口获取bean
  3. ListableBeanFactory,Bean基本信息
  4. HierarchicalBeanFactory,建立父子容器的级联关系
  5. ConfigurableBeanFactory
  6. AutowireCapableBeanFactory, 自动装配bean
  7. SingletonBeanRegistry,运行期间注册单例bean
  8. DefaultSingletonBeanRegistry,提供缓存单例Bean的缓存(HashMap)
  9. ApplcationContext, 三个重要的父类

ApplicationContext

spring-application.jpeg

  1. ClassPathXmlApplicationContext,类路径加载FileSystemXmlApplicationContext ,文件系统加载
  2. ApplicationEventPublisher,发布订阅事件
  3. ResourcePatternResolver,PathMatchingResourcePatternResolver 解析配置文件
  4. WebApplicationContext,提供ServletContext,加载web根目录

Bean作用域

bean-scope就4个

<bean id=".." class="..." scope="singleton"/>
<!--1,2是Application默认支持的2中-->
  1. singleton: 注意线程安全,无状态使用
  2. prototype(原生类型): 每次都会创建新的实例
  3. request:只在一次HttpRequest请求中有效
  4. session:会话期间
  5. global-session(spring5已经废弃)

1,2是Spring提供的;3,4,5是MVC扩展的

bean生命周期

yemengying.com/2016/07/14/…

// 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

事务隔离级别(对应数据库的四个级别+数据库默认级别)

  1. TransactionDefinition.ISOLATION_DEFAULT
  2. TransactionDefinition.ISOLATION_READ_UNCOMMITTED
  3. TransactionDefinition.ISOLATION_READ_COMMITTED
  4. TransactionDefinition.ISOLATION_REPEATABLE_READ
  5. 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/

  • mp.weixin.qq.com/s/wcK2qsZxK…