SpringIOC和AOP两大核心

Spring

spring框架给开发带来了春天!

spring的目的:为解决企业级开发应用的复杂性!

spring是一个轻量级开源的控制反转(ioc)和面向切面(aop)的容器框架。<--两个核心

spring的前身,interface 21 官网地址:https://www.interface21.io

spring Framework 创始人: Rod Johnson ,是一名音乐家!

轮子理论:不要重复的造轮子。Don`t Reinvent the Wheel。别人已经做过的,我们需要直接拿过来用就好,而不要重复制造。我们应该站在巨人的肩膀上造新的轮子!

spring设计理念: 当了解框架时,不仅要了解框架的工作而且了解框架的原理。

spring代码质量非常高,源码用了大量的设计模式,我们都是可以去学习的!

spring本身就是一个大杂烩,整合了现有的技术框架。

SSH : Struts2 + Spring + Hibernate(全自动的持久层框架)

SSM : SpringMVC + Spring + Mybatis(半自动的持久层框架,可定制性更高,sql更灵活)

spring的组成(七大核心)

在spring的官网有这样的介绍:现代化的java开发,就是基于spring的开发!

  • spring boot

    • 一个快速开发的脚手架

    • 基于springboot可以快速开发单个微服务

    • 约定大于配置

  • spring cloud

    • springcloud是基于springboot开发的

学习springboot的前提,需要先掌握spring和springmvc,才能更好的理解和使用!

 

spring两大核心:IOC控制反转 和 AOP 面向切面

IOC:控制反转是一种思想,而依赖注入是一种实现方式,解耦是最终实现的效果

 // 举例:person人员接口,学生类、老师类和员工类都实现了person接口
 Person new Student();// 在最初没有springIOC时,客户说要调用学生类,开发人员就需要new Student()
 Person new Teacher();// 客户说要调用老师类,开发人员就需要new Teacher()
 // *这种情况下,程序员需要因为客户的每一次需求去修改原有的代码,实际控制权在程序员手上
 ----------------------------
 // springIOC出现后
 private Person person;
 public void setPerson(Person person){ // 利用set动态实现值的注入
     this.person person;// DI依赖注入:bean对象的创建依赖容器,bean对象中的所有属性,由容器注入
 }
 // *这种情况下,程序是根据客户的需要而被动接收值,实际控制权在客户手上。
 // 控制权发生了变化(获得依赖对象的方式反转了,主动编程变成了被动接收),这就是我理解的控制反转!同时系统的耦合性也大大降低,程序员可以更加专注于业务的实现,即使客户提出新需求(例如添加一个家长类),程序员只需要横向扩展业务,而无需改变原本的代码和架构。

img

补充:什么是耦合?什么是解耦?什么是高内聚,低耦合?

耦合:两个或两个以上个体互相作用而彼此影响。简单说就是A依赖于B,或AB互相依赖,存在强关联。

解耦:就是将强关联降低,使个体与个体之间互相独立,不互相影响。没有绝对的解耦,只有尽量的低耦合。

高内聚,低耦合:比如人是一个个体(可以看做是一个模块),人的大脑,手臂,腿等各种肢体器官(可以看做是模块内的元素),都是紧密结合的,高度协调与配合,这就是高内聚。而不同的人就是不同的个体(不同的模块),是独立的,互不影响的,这就是低耦合。

官方:控制反转是一种通过描述(xml或注解)并通过第三方去生产或获取特定对象的方式。在spring中实现控制反转的是ioc容器,其实现方法是依赖注入。所谓的IOC,一句话,就是对象由Spring来创建,管理和装配!


单例模式(singleton)和原型模式(prototype)


bean的自动装配:

  • 自动装配是spring满足bean依赖的一种方式

  • spring会在上下文中自动寻找,并自动给bean装配

在spring中有三种装配方式

  1. 在xml中显示装配

  2. 在java中显示装配

  3. 隐式自动装配bean(重点)

@Resource 和 @Autowird 的区别:

  • 都是用来自动装配的,都可以放在属性字段上

  • @Autowird 通过byType的方式实现,而且必须要求这个对象存在

  • @Resource 默认通过byname的方式实现,找不到名字,则通过byType实现

@Nullable 标记字段可以为null

@Component组件,标记类被spring容器管理,等价与<bean id="" class=""/>

@Value 属性注入值

@Component 有几个衍生注解,我们在web开发中,会按照mvc三层架构分层

  • dao [ @Repository ]

  • service [ @Service ]

  • controller [ @Controller ]

  • 这四个注解功能都一样,都是代表将某个类注册到spring容器中,自动装配bean

作用域:@Scope("singleton") 单例模式 ;@Scope("prototype") 原型模式

@Configuration 配置类

 


代理模式

静态代理:

例子1:客户买房(访问代理对象的人) : 中介(代理角色) : 房东卖方(真实角色,被代理的人) : 抽象角色(接口)

例子2:A接口有增删改查等N多个方法,B类实现了A接口,此时程序运行正常。程序运行一定时候后,要求每个方法 调用都要记录日志,该如何去做? 在不改变原有代码的情况下,增加一个代理类C并实现A接口,同时引入B 类,C实现A方法时只是调用了B的具体实现,同时添加日志功能

静态代理的好处:真实对象可以专注于自己业务功能;其他公共业务就给代理角色,实现业务的分工

缺点:一个静态代理类只能代理一个真实类,代码量翻倍且开发效率低(可通过动态代理解决)

动态代理(使用反射实现):

  • 动态代理和静态代理的角色一样

  • 动态代理的代理类是动态生成的,而静态代理是我们直接写好的

  • 动态代理分为两大类:

    • 基于接口的动态代理:jdk动态代理

    • 基于类的动态代理:cglib

    • java字节码实现:javasist

需要理解两个类:

  • proxy 用来生成动态代理实例

  • InvocationHandler 调用处理程序并返回一个结果

动态代理的好处:除了包含静态代理的好处外,动态代理的是接口,一个动态代理可以代理多个类(实现同一接口的类),一般代理一类业务


 

AOP:面向切面编程,通过预编译方式和运行期动态代理实现程序功能统一维护的一种技术。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可复用性,同时提高开发效率。

简单说:AOP是一种横向编程的思想,在不影响原本业务代码的情况下,实现动态的增强。使用代理模式,只不过是spring帮我们实现了,称为AOP。

点击查看图片来源

点击查看图片来源

实现AOP的三种方式:

  • 使用Spring的API接口

  • 自定义实现AOP -> 对切面的定义

  • @Aspect 标注一个类是切面


声明式事务

什么是事务;用一句话来说,就是 要么都成功,要么都失败,确保数据的完整性和一致性。

事务ACID原则:

  • 原子性:指事务上一个整体的,不可分割的,要么一起完成,要么一起失败。

  • 一致性:预期结果和实际结果上一样的

  • 隔离性:多用户并发访问同一数据资源,多个并发事务要相互隔离

  • 持久性:数据一旦提交,数据改变就是永久的

 

 

 

posted @ 2022-01-18 23:21  迷路小孩  阅读(53)  评论(0)    收藏  举报