• AOP、IOC、注解、反射



    技术教程: https://gitee.com/AlanShelby/Course-Chapter

    一.AOP简述

    AOPAspect Oriented Programming面向切面编程

    AOP不是一种技术,实际上是编程思想。凡是符合AOP思想的技术,都可以看成是AOP的实现

    ​ 通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 AOP 是 OOP 的延续,是软件开发中的一个热点,也是 Spring 框架中的一个重要内容,是函数式编程的一种衍生范型


    使用AOP的好处

    • 降低模块的耦合度
    • 使系统容易扩展
    • 提高代码复用性

    术语

    连接点(JoinPoint):需要在程序中插入横切关注点的点,连接点可能是在类初始化、方法调用、字段调用或处理异常等等。Spring中只支持方法执行连接点。

    切入点(Pointcut):一组相关连接点的集合。

    通知(Advice):在连接点上执行的行为,增强提供了在AOP中需要在切入点所选择的连接点处进行扩展现有行为的手段。包括前置增强(before advice)、后置增强 (after advice)、环绕增强 (around advice)。

    切面(Aspect):通知和切入点的结合。

    织入(Weaving):织入是一个过程,是将切面应用到目标对象从而创建出AOP代理对象的过程。

    代理(Proxy):通过代理方式来对目标对象应用切面。AOP代理可以用JDK动态代理CGLIB代理实现。

    目标对象(Target):需要被织入关注点的对象。即被代理的对象。

    通知(Advice):通知是切面的一种,可以完成简单的织入功能。通知可以定义切面织入的时间点,切入点定义了切面织入的位置。

    顾问(Advisor):顾问是切面的一种,能够将通知以更为复杂的方式织入到目标对象中,是将通知包装为更复杂的切面的装配器。


    在这里插入图片描述

    /*AOP编程使用
    *注解版本实现AOP
    */
    @Aspect //指定一个类为切面类
    @Pointcut("execution(* com.itmayiedu.service.UserService.add(..))")  //指定切入点表达式
    @Before("pointCut_()")// 前置通知: 目标方法之前执行
    @After("pointCut_()") //后置通知:目标方法之后执行(始终执行)
    @AfterReturning("pointCut_()")  //返回后通知: 执行方法结束前执行(异常不执行)
    @AfterThrowing("pointCut_()") //异常通知:  出现异常时候执行
    @Around("pointCut_()") //环绕通知: 环绕目标方法执行
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    编程应用场景

    日志记录,性能统计,安全控制,事务处理,异常处理。

    二.IOC概述

    IOC(控制反转)就是依赖倒置原则的一种代码设计思路。就是把原先在代码里面需要实现的对象创建、对象之间的依赖,反转给容器来帮忙实现。

    1、什么是 IoC 容器

    所谓的 IoC 容器就是指的 Spring 中 Bean 工厂里面的 Map 存储结构(存储了 Bean 的实例)。

    2、Spring框架中的工厂有哪些

    (1)ApplicationContext 接口:

    • 实现了 BeanFactory 接口
    • 实现 ApplicationContext 接口的工厂,可以获取到容器中具体的 Bean 对象

    (2)BeanFactory 工厂(是 Spring 框架早期的创建 Bean 对象的工厂接口)

    • 实现 BeanFactory 接口的工厂,也可以获取到 Bean 对象

    其实通过源码分析,不管是 BeanFactory 还是 ApplicationContext,其实最终的底层BeanFactory 都是 DefaultListableBeanFactory。

    3、ApplicationContext 和 BeanFactory的区别?

    创建 Bean 对象的时机不同:

    (1)BeanFactory 采取延迟加载,第一次调用 getBean() 方法时才会初始化 Bean。

    (2)ApplicationContext 是加载完 applicationContext.xml 时,就创建具体的 Bean 对象的实例。(只对 BeanDefition 中描述为是单例的 bean,才进行饿汉式加载

    4.使用IOC的好处

    • 集中管理,实现类的可配置和易管理。
    • 降低了类与类之间的耦合度。

    三.注解

    1.基本内置注解

    @Override 用在方法上,表示这个方法重写了父类的方法

    @Deprecated 表示这个方法已经过期,不建议开发者使用。(暗示在将来某个不确定的版本,就有可能会取消掉)

    @SuppressWarnings Suppress英文的意思是抑制的意思,这个注解的用处是忽略警告信息。

    @SuppressWarnings 有常见的值,分别对应如下意思
    1.deprecation:使用了不赞成使用的类或方法时的警告(使用@Deprecated使得编译器产生的警告);
    2.unchecked:执行了未检查的转换时的警告,例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型; 关闭编译器警告
    3.fallthrough:当 Switch 程序块直接通往下一种情况而没有 Break 时的警告;
    4.path:在类路径、源文件路径等中有不存在的路径时的警告;
    5.serial:当在可序列化的类上缺少 serialVersionUID 定义时的警告;
    6.finally:任何 finally 子句不能正常完成时的警告;
    7.rawtypes 泛型类型未指明
    8.unused 引用定义了,但是没有被使用
    9.all:关于以上所有情况的警告。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2.元注解

    @Target 表示这个注解能放在什么位置上

    ElementType.TYPE:能修饰类、接口或枚举类型
    ElementType.FIELD:能修饰成员变量
    ElementType.METHOD:能修饰方法
    ElementType.PARAMETER:能修饰参数
    ElementType.CONSTRUCTOR:能修饰构造器
    ElementType.LOCAL_VARIABLE:能修饰局部变量
    ElementType.ANNOTATION_TYPE:能修饰注解
    ElementType.PACKAGE:能修饰包  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    @Retention 表示生命周期

    RUNTIME>CLASS>SOURCE (这是作用域大小比较)

    RetentionPolicy.SOURCE: 注解只在源代码中存在,编译成class之后,就没了。@Override 就是这种注解。
    
    RetentionPolicy.CLASS: 注解在java文件编程成.class文件后,依然存在,但是运行起来后就没了。@Retention的默认值,即当没有显式指定@Retention的时候,就会是这种类型。
    
    RetentionPolicy.RUNTIME: 注解在运行起来之后依然存在,程序可以通过反射获取这些信息,
    
    • 1
    • 2
    • 3
    • 4
    • 5

    @Inherited 表示该注解具有继承性。

    @Document 表示是否将我们的注解生成在javadoc中

    3.自定义注解

    在这里插入图片描述

    注意,只有一个值的时候,使用value,在赋值时可以忽略,但其他的单词是不行的,这是一个不成文的规定

    四.反射

    1.动态语言与静态语言

    动态语言:在运行代码的时候可以改变自身的结构(Object-C, C#, JavaScript, PHP, Python)

    静态语言:运行时结构不可变(Java, C, C++)

    Java不是动态语言,但java被称之为“准动态语言”。我们可以利用反射机制获得类似于动态语言的特性

  • 相关阅读:
    2023_Spark_实验二十:SparkStreaming累加计算单词频率
    Python爬虫实战案例——第四例
    一起学docker系列之三docker的详细安装步骤
    UI/UX+前端架构:设计和开发高质量的用户界面和用户体验
    使用python计算行列式
    Pytroch 常见问题总结
    SpringSecurity详解
    Windows 安装 chromedriver 和 Python 调试
    clang插件对llvm源码插桩,分析函数调用日志(1)
    MySQL之数据库编程(创建存储函数&&设置触发器)
  • 原文地址:https://blog.csdn.net/qq_44625080/article/details/126820262