1.springSpring是一个开源的轻量级控制反转和面向切面编程的容器框架。轻量级是说它开发使用简单功能强大控制反转是指将对象的创建销毁控制交给 ioc容器方便解耦合降低维护难度面向切面编程是指将相同的逻辑横向抽取出来可以对一些通用业务如事务日志进行集中管理1.spring的bean懒加载和非懒加载区别懒加载需要使用对象的时候才创建节省资源非懒加载也叫迫切加载容器启动时就创建对象消耗资源spring中默认时迫切加载即在项目启动时spring会扫描符合条件的所有bean并将其初始化如果需要懒加载可以使用Lazy注释或者xml中配置属性default-lazy-init“true”2.spring的依赖注入1.setter 方式注入通过反射调用无参构造方法生成对象再通过对于的setter方法注入配置支持注解和 xml两种实现方式2.构造器方式注入通过反射调用有参构造方法生成对象支持注解和 xml两种实现方式注解实现方式Autowired它是默认按类型匹配的、Resource它是默认按名字匹配的3.spring中 单例默认单例和多例的区别如果一个bean是单例模式的在处理多次请求的时候在ioc容器中只实例化一个bean这个对象会被保存在一个 ConcurrentHashMap中当有请求来的时候会先从map中查看如果有就直接使用这个对象没有才会实例化新的对象。如果是多例模式的bean每次请求来的时候会直接实例化新的bean没有map缓存的过程。注单例模式中对象的生命周期是ioc容器来管理但是多例模式是不管的要么我们自己管理要么等对象没有引用了垃圾回收机制来销毁。4.spring 的 事务机制1.什么是事务事务是一组不可分割的操作序列这些操作要么全部成功执行要么全部失败回滚以此来保证数据的一致性和完整性。2.事务传播机制当一个事务方法调用另一个事务方法时Spring 如何管理这些事务的开启、挂起、合并等操作。1.PROPAGATION_REQUIRED 默认当一个事务方法调用另一个使用PROPAGATION_REQUIRED的事务方法时如果调用者已经开启了事务被调用方法就加入这个事务如果调用者没有事务被调用方法就开启新事务。2.PROPAGATION_SUPPORTS当一个事务方法调用另一个使用PROPAGATION_SUPPORTS的事务方法时如果当前存在事务被调用方法就加入该事务如果没有事务就以非事务方式执行。3.PROPAGATION_MANDATORY当一个事务方法调用另一个使用PROPAGATION_MANDATORY的事务方法时,如果当前存在事务被调用方法就加入该事务如果没有事务就抛异常。4.PROPAGATION_REQUIRES_NEW当一个事务方法调用另一个使用PROPAGATION_REQUIRES_NEW的事务方法时不管当前是否有事务被调用方法都会创建新事务。如果当前有事务会先挂起当前事务等新事务执行完再继续执行原来的事务。5.PROPAGATION_NOT_SUPPORTED当一个事务方法调用另一个使用PROPAGATION_NOT_SUPPORTED的事务方法时以非事务方式执行如果当前有事务会挂起当前事务。6.PROPAGATION_NEVER当一个事务方法调用另一个使用PROPAGATION_NEVER的事务方法时以非事务方式执行如果当前存在事务就会抛出异常。7.PROPAGATION_NESTED当一个事务方法调用另一个使用PROPAGATION_NESTED的事务方法时如果当前存在事务就在嵌套事务中执行如果没有事务就创建新事务。嵌套事务有自己的保存点可以独立回滚。通俗理解你在餐厅吃饭如果有朋友在一个大包间里聚餐你就在这个大包间里再隔出一个小包间自己聚餐嵌套事务要是没有朋友在聚餐你就自己开个包间聚餐创建新事务。小包间出问题了嵌套事务回滚不影响大包间里其他人吃饭外部事务可以选择是否继续。5.事务失效的场景1.数据库本身不支持事务例如 MySQL 的 InnoDB 存储引擎支持事务而 MyISAM 不支持。2.在 Spring 中只有public方法上的事务注解才会生效。因为 Spring AOP 是通过代理模式实现事务管理的代理机制对非public方法的支持存在限制。3.当一个类的内部方法调用另一个有事务注解的方法时事务会失效。这是因为 Spring AOP 是基于代理模式实现的内部调用不会经过代理对象从而无法触发事务拦截器Service public class UserService { public void outerMethod() { // 内部调用事务失效 this.innerMethod(); } Transactional public void innerMethod() { // 数据库操作 } } // 事务失效4.Transactional注解默认只对RuntimeException及其子类和Error进行回滚。如果抛出的异常不是这些类型事务将不会回滚。但是可以自己定义即可Transactional(rollbackFor Exception.class) public void updateProduct() throws Exception { // 数据库操作 } // 这会儿就能识别到该异常5.事务传播行为配置错误 PROPAGATION_SUPPORTS。6.异常事件被自己try catch掉了。7.如果数据源配置不正确如数据库连接信息错误、数据源未正确注入等会导致事务管理无法正常工作。6.aop用到的设计模式体现为拦截器执行链执行链模式客户端调用 → 代理对象 → 拦截器链执行 ↓ [Before Advice 1] → [Before Advice 2] → [Around Advice] ↓ 目标方法执行Method Invocation ↓ [After Returning Advice] → [After Advice] → [After Throwing Advice]Before→AspectJMethodBeforeAdviceAfterReturning→AspectJAfterReturningAdviceAround→AspectJAroundAdvice2. spring bootSpringboot是一个基于spring的框架对spring做了大量简化使开发流程更快更高效大量简化maven依赖管理了大量的基础依赖基于注解配置JavaConfig无需xml配置xml配置是真的难受内嵌Tomcat没记错是某个依赖提供的部署流程简单打包和部署更加灵活允许独立运行微服不就是一个个的boot项目嘛1.spring-boot-starter-web该依赖构建了web项目的基本环境集成了日志tomcatspringmvcjson支持等2.BeanFactory 和 ApplicationContext// 类层次结构简化 BeanFactory (基础容器) ↑ ListableBeanFactory ↑ HierarchicalBeanFactory ↑ ApplicationContext (高级容器) ↑ ConfigurableApplicationContext ↑ AbstractApplicationContext ↑ ClassPathXmlApplicationContext // 具体实现 FileSystemXmlApplicationContext AnnotationConfigApplicationContext WebApplicationContextApplicationContext 是 BeanFactory 的超集提供更多企业级功能延迟加载 vs 迫切加载是最显著的区别影响启动时间和内存使用ApplicationContext 通过启动时检测配置错误发现问题Spring Boot 默认使用 ApplicationContext并进行了优化现代应用通常使用 ApplicationContext除非有特殊资源限制