Spring框架学习笔记

发布时间:2026/7/16 5:23:24
Spring框架学习笔记 场景引入OCP开闭原则对扩展开对修改闭。只要你在扩展系统功能的时候没有修改以前写好的代码那么你就是符合OCP原则的。DIP依赖倒置原则面向接口编程面向抽象编程不面向具体编程。上不依赖下就是符合DIP。程序违背了OCP原则 也违背了DIP原则这时候 采用控制反转IoCInversion of Control思想来解决。反转的是两件事我不在程序中采用硬编码的方式来维护对象的关系了也不用硬编码的方式来new对象了。Spring框架Spring框架实现了控制反转IoC这种思想Spring框架来new对象和维护对象的关系。实现方式依赖注入DIDependency Injection依赖A对象和B对象的关系注入通过这种手段让A和B产生关系。分两种set注入和构造方法注入特点1、轻量 非侵入式的框架侵入式不好做单元测试2、控制反转 3、面向切面编程 4、容器Bean 5、框架Spring底层Ioc如何实现的XML解析工厂模式反射机制Bean的生命周期分五步1.实例化Bean调用无参构造方法2.给Bean属性赋值调用set方法3.初始化Bean调用Bean的init方法init方法要自己写自己配4.使用Bean5.销毁Bean调用Bean的destroy方法destroy方法需要自己写自己配分七步1.实例化2.Bean属性赋值3.执行Bean后处理器的before方法4.初始化Bean5.执行Bean后处理器的after方法6.使用Bean7.销毁Bean分十步1.实例化2.Bean属性赋值3.检查Bean是否实现了Aware的相关接口并设置相关依赖4.执行Bean后处理器的before方法5.检查Bean是否实现了initializingBean接口并调用接口方法6.初始化Bean7.执行Bean后处理器的after方法8.使用Bean9.检查Bean是否实现了DisposableBean接口并调用接口方法10.销毁BeanSpring容器只对单例模式的Bean进行完整的生命周期管理如果是prototype作用域的BeanSpring容器只负责将Bean初始化完毕等客户端程序一旦获取到Bean后Spring容器就不再管理该对象的生命周期了。singletonsetter模式下的循环依赖A的属性需要B赋值B的属性需要A赋值是没有问题的。因为spring容器在加载的时候实例化Bean对象所有bean对象都会曝光。在prototypesetter模型下循环依赖是存在问题的因为是多例模式。如果其中一个是单例那就没有问题。三级缓存三个缓存都是Map集合Map集合的key存储的都是bean的namebean id一级缓存豆子完整的单例Bean对象这个缓存中的Bean对象的属性都已经赋值了是一个完整的Bean对象。二级缓存青涩的豆子早期的单例Bean对象这个缓存中的Bean对象的属性没有赋值只是一个早期的实例对象。三级缓存植株-长豆子的单例工厂对象这个里面存储了大量的工厂对象每一个单例Bean对象都会对应一个单例工厂对象。这个集合中存储的是创建该单例对象时对应的那个单例工厂对象。SpringIoc注解式开发简化XML的配置声明Bean注解常见的注解Component 以下三种本质都是component 只是为了方便可读 所以分了三种ControllerServiceRepository怎么使用加入aop的依赖在配置文件中添加context命名空间在配置文件中指定扫描的包在Bean类上使用注解。负责注入的注解Value 注入简单类型使用Value注解注入 可以用在属性上 并且可以不写setter方法也可以使用在set方法、构造方法上。Autowired 注入非简单类型 默认根据类型来装配Qualifier 和Autowired联合使用 用名字来装配用在属性、setter方法、构造方法、构造方法参数上Resource 也可以完成非简单类型注入 默认根据名称装配 如果找不到名称 就用类型装配用在属性上和setter方法上属于JDK扩展包需要加依赖。jakarta.annotatiopn-apiJdbcTemplate不用过多了解是对Jdbc的封装简化JDBC代码。GoF代理模式在Java程序中的代理模式的作用1.当一个对象需要受到保护的时候可以考虑使用代理对象去完成某个行为。2.需要给某个对象的功能进行功能增强的时候可以考虑找一个代理进行增强。3.A和B无法直接交互可以用代理模式解决。三大角色目标对象代理对象公共接口让客户端在使用代理的时候以为是在用目标对象静态代理代理对象将目标对象作为代理对象的一个属性形成关联关系比继承关系耦合度低。代理对象含有目标对象的引用关联关系has a创建代理对象的时候要传一个目标对象给代理对象。 构造方法优点解决OCP问题采用代理模式的has a 可以减低耦合度缺点 类爆炸假设系统有1000个接口那每个接口都得有对应的代理类这样类会急剧膨胀不好维护。动态代理字节码生成技术可以在内存中为我们动态地生成Class字节码这个字节码就是代理类。常见技术JDK动态代理技术只能代理接口。CGLIB动态代理技术开源代码生成库可以代理接口也可以代理类。底层是用继承方式实现的性能比JDK动态代理要好。Javassist动态代理技术通过使用javassist对字节码操作为JBoss实现动态aop框架。面向切面编程AOPAOP是对OOP的补充延伸。Spring的AOP使用的动态代理是JDKCGLIB。一般系统重都会有一些系统服务比如日志、事务管理和安全等等这被称为交叉业务。交叉业务基本是通用的将和核心业务无关的代码独立地抽取出来形成一个独立的组件然后以横向交叉的方式应用到业务流程当中的过程被称为AOP。优点代码复用性强代码易维护使开发者更关注业务逻辑。AOP七大术语连接点JoinPoint在程序的整个执行流程中可以织入切面的位置。方法的执行前后异常抛出之后等位置。切点Pointcut在程序执行流程中真正织入切面的方法。一个切点对应多个连接点通知Advice又叫增强具体你要织入的代码。 通知包括 前置通知Before后置通知AfterReturning环绕通知Around 最大的范围 在前置通知之前后置通知、最终通知之后异常通知AfterThrowing 发生异常之后执行的通知最终通知After 放在finalliy语句块中的通知。切面Aspect切点通知就是切面织入Weaving把通知应用到目标对象上的过程代理对象Proxy一个目标对象被织入通知后产生的新对象目标对象Target被织入通知的对象两个切面之间谁先执行 用Order数字数字越小 优先级越高Spring对事务的支持ACID 原子性 一致性 隔离性 持久性基于面向切面编程aop的二次封装声明式事务基于注解方式最多 或者 基于XML配置方式Transactional事务的7种传播行为REQUIRED支持当前事务如果不存在就新建一个没有就新建有就加入SUPPORTS支持当前事务如果当前没有事务就以非事务的方式执行有就加入没有就算了MANDATORY必须运行在一个事务中如果当前没有事务正在发生将抛出一个异常有就加入没有就抛异常REQUIRES_NEW开启一个新事务如果一个事务已经存在则将这个存在的事务挂起不管有没有直接开新的开启的新的和之前的不存在嵌套关系之前的事务被挂起NOT_SUPPORTED以非事务的方式运行如果有事务存在挂起当前事务不支持事务存在就挂起NEVER以非事务的方式运行如果有就抛出异常不支持事务存在就抛异常NESTED如果当前有一个事务正在进行中则该方法应当运行在一个嵌套式事务中。被嵌套的事务可以独立于外层事务进行提交或回滚。如果外层事务不存在行为就像REQUIRED一样。有事务的话就在这个事务里再嵌套一个完全独立的事务嵌套的事务可以独立的提交和回滚没有事务就和REQUIRED一样。事务的隔离级别数据库中读取数据存在的三大问题脏读读取到数据库里没有的数据不可重复读在同一个事务中第一次和第二次读到的数据不一样幻读读到的数据是假的。DEFAULTREAD_UNCOMMITTED 读未提交 存在脏读 可以读到其他事务未提交的数据READ_COMMITTED 读已提交 解决脏读问题 其他事务提交后才能读到但是存在不可重复读REPEATABLE_READ 可重复读 mysql默认级别 解决了不可重复读 只要当前事务不结束读到的数据一直是一样的但存在幻读问题SERIALIZABLE 序列化 解决了幻读问题事务排队执行不支持并发。事务超时Transactional(timeout 10)表示超过10s如果事务中的所有DML语句还没有执行完毕的话最终结果会选择回滚如果想让整个方法的所有代码都计入超时时间的话可以在方法最后一行添加一行无关紧要的DML语句。只读事务Transactional(readOnlytrue)将当前事务设置为只读事务在该事务执行过程中只允许select语句执行。不能用增删改。作用是启动spring的优化策略提高select语句的执行效率。特定回滚还可以设置哪些异常回滚事务或者是设置哪些异常不回滚事务。Transactional(rollbackFor RuntimeException.class)Transactional(noRollbackFor NullPointerException.class)八大设计模式·简单工厂模式BeanFactory的getBean方法通过唯一标识来获取Bean对象。静态工厂模式工厂方法模式FactoryBean在配置文件中通过factory-method属性来制定工厂方法该方法是一个实例方法。单例模式Spring用的是双重判断加锁的单例模式 getSingleton代理模式AOP 用的动态代理实现的装饰器模式IO流Spring根据每次请求的不同将dataSource属性设置成不同的数据源以达到切换数据源的目的。Spring中类名里带Decorator和Wrapper的类 都是装饰器模式观察者模式Servlet中的ServletContextListener就是观察者模式观察者ServletContextListener被观察者ServletContext 事件ServletContext对象被创建或者是被销毁。Spring中的事件编程模型 ApplicationListener接口用来监听Application的事件。 Application就是 ApplicationContext。策略模式行为性模式调用不同的方法适应行为的变化强调父类的调用子类的特性。getHandler是HandlerMapping接口中的唯一方法用于根据请求找到匹配的处理器。模板方法模式JdbcTemplate类就是末班类。在模板类的模板方法execute中编写核心算法具体实现步骤在子类中完成。