spring面试知识
说说Spring 里用到了哪些设计模式?
- 单例模式:Spring 中的 Bean 默认情况下都是单例的。无需多说。
- 工厂模式:工厂模式主要是通过 BeanFactory 和 ApplicationContext 来生产 Bean 对象。
- 代理模式:最常见的 AOP 的实现方式就是通过代理来实现,Spring主要是使用 JDK 动态代理和 CGLIB 代理。
- 模板方法模式:主要是一些对数据库操作的类用到,比如 JdbcTemplate、JpaTemplate,因为查询数据库的建立连接、执行查询、关闭连接几个过程,非常适用于模板方法。
- 编译时织入:指的是增强的代码和源代码我们都有,直接使用AspectJ 编译器编译就行了,编译之后生成一个新的类,他也会作为一个正常的Java类装载到JVM
- 编译后织入:指的大幕已经被编译成class文件或者已经打成jar包,这时候要增强的话,就是编译后织入,比如你依赖了第三方的类库,又想对他增强的话,就可以通过这种方式
- 加载时织入:指的是JVM加载类的时候进行织入
- PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,这也是通常我们的默认选择。
- PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
- PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。
- PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
- PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
- PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
- PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。
- 实例化,创建一个Bean对象
- 填充属性,为属性赋值
- 初始化
- 如果实现了xxxAware接口,通过不同类型的Aware接口拿到Spring容器的资源
- 如果实现了BeanPostProcessor接口,则会回调该接口的postProcessBeforeInitialzation和postProcessAfterInitialization方法
- 如果配置了init-method方法,则会执行init-method配置的方法
- 容器关闭后,如果Bean实现了DisposableBean接口,则会回调该接口的destroy方法
- 如果配置了destroy-method方法,则会执行destroy-method配置的方法
- 准备环境,根据不同的环境创建不同的Environment
- 准备、加载上下文,为不同的环境选择不同的Spring Context,然后加载资源,配置Bean
- 初始化,这个阶段刷新Spring Context,启动应用
- 最后结束流程