目录

1、控制反转(IOC)

1.1、实现原理(流程):(反射+XML技术)

1.2、IOC的好处

1.3、IOC类型

1.4、IOC的初始化过程

1.5、拓展:反射和new

2、AOP(面向切面编程)

2.1、AOP的应用场景

2.2、AOP基本术语切点、切面、连接点、通知等

2.3、AOP的两种实现方式(注解、xml文件)

2.3.1、XML方式

2.3.2、注解方式

2.4、AOP原理(动态代理)

2.4.1、JDK(动态)代理(反射)

2.4.2、cglib代理

2.5、Spring默认动态代理


1、控制反转(IOC)

将创建管理对象的工作交给容器来做。在容器初始化(或在某个时间节点)通过反射机制创建好对象,在使用时直接从容器中获取。

  • 控制反转:将对象的控制权反过来交给容器管理。
  • 依赖注入(DI):将对象依赖写入配置文件,在创建有依赖关系的对象时,由IOC容器来注入依赖的兑现。构造器注入、setter方法注入。

1.1、实现原理(流程):(反射+XML技术)

利用(反射+工厂)技术,根据配置文件中给出的类名生成相应的对象。

Class.forName(className).newInstance。

  • Tomcat启动Spring容器;
  • 初始化Spring容器,加载application.xml配置文件;
  • 获取扫描包下所有class文件;
  • 解析class中的注解信息;
  • 通过反射实例化相应bean对象,以<beanId,bean>的形式保存集合,存储在IOC容器中。
  • 通过ApplicationContext的getBean方法获取Bean。

1.2、IOC的好处

创建Bean及其依赖对象的工作交给IOC容器管理,业务代码只需要getBean就行了。将依赖关系写入配置文件中,有修改时,直接修改配置文件即可,而不用去业务代码中每一个使用Bean的地方修改。

1.3、IOC类型

  • 构造注入:通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。(对象的依赖关系可在构造函数中完成)。
  • Setter方法注入:容器通过调用无参构造器或无参static方法实例化bean之后,调用bean的setter方法。

1.4、IOC的初始化过程

资源定位、资源载入BeanDefinition、<BeanName、BeanDefiniton>注册到IOC容器。

a、Resource定位(Bean的定义文件定位),返回Resource对象

        Resource对象与对应ApplicationContext类型如下

        FileSystemResource(绝对路径定位):FileSystemXmlApplicationContext;
        ClassPathResourcee(类路径定位):ClassPathXmlApplicationContext;
        ServletContextResource(web应用根目录):XmlWebApplicationContext;
        UrlResource:访问网络资源的实现类。例如file: http: ftp:等前缀的资源对象;
        ByteArrayResource: 访问字节数组资源的实现类。

@Configuation:AnnotationConfigApplicationContext

Spring提供ResourceLoader接口用于实现不同的Resource加载策略,所有的ApplicationContext均实现了ResourceLoader。

b、将Resource定位好的资源载入到BeanDefinition

加载Resource对象中的Bean配置成BeanDefinition,如果Bean有依赖关系,则使用占位符(getBean时,将占位符替换成相应的Bean)暂时代替。

c、将<BeanName, BeanDefinition>注册到IOC容器中

1.5、拓展:反射和new

  1. new只能用于编译期就能确定的类型, 而反射可以在运行时才确定类型并创建其对象。例如:Spring是事先写好的框架,在编译时其内部处理并不知道将来用户要加载哪些类到IOC容器中,此时就需要使用到反射;
  2. 使用new出来的对象无法访问私有属性,使用反射出来的对象可以通过setAccessible访问私有属性。
  3. 使用反射可以使程序代码更加灵活,使用运行期的动态加载。

2、AOP(面向切面编程)

将一些系统性相关(日志、事务、安全)的编程工作,独立提取出来,独立实现,作为一个公共切面切入到相关的业务逻辑中。

将业务逻辑代码与公共功能代码分离开,使开发人员能更专注地编写业务逻辑代码。

在不改变业务逻辑代码的前提下,在业务逻辑之前、之后、或者周围添加横切关注点(切面),对目标功能进行扩展。

2.1、AOP的应用场景

事务(数据库更新),权限(web请求权限),日志(每一次更新记录)等。

2.2、AOP基本术语切点、切面、连接点、通知等

  • 通知:定义AOP切面执行的工作,以及切面执行的时间。(Before、After、After-returning、After-throwing、Around)
  • 切点:定义切面执行的地点,满足配置条件的目标方法(在什么地方执行切面)。
  • 连接点:切点的全集。一个程序可能会有多个切面,不同切面映射需要不同切点。
  • 切面:切点+通知。在什么时候、什么地点、执行什么工作。

2.3、AOP的两种实现方式(注解、xml文件)

2.3.1、XML方式

普通工程通过new ClassPathXmlApplicationContext("applicationContext.xml")初始化Spring。

在执行DogService类中的方法时,执行前会先执行PointCutXmlConf类中的beforeAdvice方法,执行后会执行PointCutXmlConf类中的afterAdvice方法。

2.3.2、注解方式

2.4、AOP原理(动态代理)

2.4.1、JDK(动态)代理(反射)

    利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理

动态代理实际上是程序在运行中,根据被代理的接口来动态生成代理类的class文件,并加载class文件运行的过程。

而动态生成的代理类已经继承了Proxy类,由于Java的单继承,所以只能靠实现被代理类的接口的形式,而不是靠继承被代理类的形式。

JVM编译完成时并没有实际的字节码文件,而是在运行时动态生成类字节码,并加载到JVM中。

优点:通过反射,可以有效减少代理类的数量,使用更灵活;

缺点:反射代理,比较消耗系统性能。

目标对象实现接口,代理对象可以不实现业务接口。

主要类:

Java.lang.reflect.Proxy以及Java.lang.reflect. InvocationHandler接口(事件处理器)

Proxy类:创建一个代理对象

InvocationHandler接口:代理实例的调用处理程序。

主要方法:

JDK代理类实例:

public class JingJiPenple{//维护一个目标对象private Object target;public JingJiPenple(Object target){this.target=target;}//给目标对象生成代理对象public Object getProxyInstance(){return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("动态代理---我是经纪人,我替明星接下这个演出");//执行目标对象方法Object returnValue = method.invoke(target, args);System.out.println("动态代理---我是经纪人,明星演出结束");return returnValue;}});}
}

也可以把InvocationHandler独立出来:

public static void main(String[] args) {IActor star = new StarPeople();// 给目标对象,创建代理对象IActor proxy = (IActor) Proxy.newProxyInstance(star.getClass().getClassLoader(), star.getClass().getInterfaces(), new MyInvocaionHandler(star));proxy.sing();proxy.dance();
}class MyInvocaionHandler implements InvocationHandler{private Object object;public MyInvocaionHandler(Object object) {this.object = object;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("动态代理前置操作");Object returnValue = method.invoke(object, args);System.out.println("动态代理后置操作");return returnValue;}}

2.4.2、cglib代理

        利用ASM(开源的Java字节码编辑库,操作字节码)开源包,将代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。

由于被代理类没有实现接口,所以运行时在内存中动态生成一个子类对象从而实现对目标对象的扩展。子类对象会重写目标对象的方法,所以目标对象不能为final类。

代理类和目标类都无需实现业务接口。

public class JingJiPenple implements MethodInterceptor{Object target;public JingJiPenple(Object target){this.target = target;}//给目标对象创建一个代理对象public Object getProxyInstance(){//工具类Enhancer en = new Enhancer();//设置父类en.setSuperclass(target.getClass());//设置回调函数en.setCallback((Callback) this);;//创建子类(代理对象)return en.create();}@Overridepublic Object intercept(Object arg0, Method method, Object[] arg2, MethodProxy proxy) throws Throwable {System.out.println("Cglib代理---我是经纪人,我代明星接下演出!!!");//执行目标对象的方法Object returnValue = method.invoke(target, arg2);System.out.println("Cglib代理---我是经纪人,明星演出结束!!!");return returnValue;}}

2.5、Spring默认动态代理

Spring在5.X之前默认的动态代理实现一直是jdk动态代理。但是从5.X开始,Spring就开始默认使用Cglib来作为动态代理实现。

SpringBoot从2.X开始也转向了Cglib动态代理实现。

JDK动态代理要求接口,没有接口的情况下会报错。

而CGLIB作为默认动态代理,效果和JDK差不多,但是不会报错,更方便。

以上内容为个人学习汇总,仅供学习参考,如有问题,欢迎在评论区指出,谢谢!

面试汇总-Spring-IOC和AOP相关推荐

  1. 自己动手实现的 Spring IOC 和 AOP - 下篇

    1. 背景 本文承接上文,来继续说说 IOC 和 AOP 的仿写.在上文中,我实现了一个很简单的 IOC 和 AOP 容器.上文实现的 IOC 和 AOP 功能很单一,且 IOC 和 AOP 两个模块 ...

  2. 自己动手实现的 Spring IOC 和 AOP - 上篇

    1. 背景 我在大四实习的时候开始接触 J2EE 方面的开发工作,也是在同时期接触并学习 Spring 框架,到现在也有快有两年的时间了.不过之前没有仿写过 Spring IOC 和 AOP,只是宏观 ...

  3. Spring IoC 和 AOP

    Spring IoC 和 AOP spring框架java开发的行业标准. spring全家桶. Web:Spring Web MVC/Spring MVC,Spring Web Flux 持久层:S ...

  4. 【Spring 源码阅读】Spring IoC、AOP 原理小总结

    Spring IoC.AOP 原理小总结 前言 版本约定 正文 Spring BeanFactory 容器初始化过程 IoC 的过程 bean 完整的创建流程如下 AOP 的过程 Annotation ...

  5. 浅谈 Spring IOC和AOP

    浅谈 Spring IOC和AOP IOC 控制反转 以前创建对象的主动权和时机是由于自己把握的,现在将这种权利转移到Spring容器中,并且根据配置文件去创建对象管理对象 ioc的注入方式有三种:构 ...

  6. 吊打面试官系列之--吃透Spring ioc 和 aop (中)

    目录 Spring SpringBean的五个作用域 SpringBean的生命周期 创建过程 销毁过程 AOP的介绍和使用 AOP的介绍 AOP的三种织入方式 操作讲解 AOP的主要名词概念 Adv ...

  7. Spring IOC 和 AOP 概览

    IOC(控制反转) IoC(Inversion of Control,控制倒转).所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系. 在没有IOC时,我们 ...

  8. BeanPostProcessor —— 连接Spring IOC和AOP的桥梁

    之前都是从大Boss的视角,来介绍Spring,比如IOC.AOP. 今天换个视角,从一个小喽啰出发,来加深对Spring的理解. 这个小喽啰就是, BeanPostProcessor (下面简称 B ...

  9. spring - ioc和aop

    1.程序中为什么会用到spring的ioc和aop 2.什么是IOC,AOP,以及使用它们的好处,即详细回答了第一个问题 3.原理 关于1: a:我们平常使用对象的时候,一般都是直接使用关键字类new ...

  10. 再品Spring Ioc 和 Aop

    文章目录 Spring好处 IOC 基于XML和基于注解开发 基于XML开发 基于注解开发 配置类 扫包+注解 依赖注入 AOP 写在前面,这篇文章写的时候我的SSM已经学过一遍了,回头来看真的受益匪 ...

最新文章

  1. 【NLP】医学AI又一突破,微软开源生物医学NLP基准:BLURB
  2. ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 接线过程
  3. 相关的类代表的颜色和文本对齐方式
  4. php 连接多个数据出错,php连接多个ip信息数据库
  5. php决策管理,报表管理与数据分析:为系统未来发展规划提供决策依据,有效避免IT管理与投资的盲目??...
  6. C++socket编程(三):3.7 服务端回应send客户端数据
  7. a标签download属性无效_使用这些 CSS 属性选择器来提高前端开发效率
  8. php mysql计算距离_php mysql 计算经纬之间距离 范围内筛选
  9. 企业如何从大数据系统中获益
  10. android二级菜单ui,巧用PopupMenu实现NavigationView的二级子菜单
  11. openwrt编译smartdns_LEDE/OpenWRT 部署SmartDNS
  12. mysql 节假日判断,sql 节假日判断(春节、中秋、国庆、周末等)
  13. Mybatis北冥有鱼面试
  14. 图片加载oom以及photoView缩放崩溃问题
  15. 快速搭建一个APMT265树莓派无人机
  16. 名图怎么弄云服务器_名图怎么弄云服务器
  17. XCTF 攻防世界 web 高手进阶区
  18. ArcGIS案例学习笔记2_1
  19. (转)私募基金机构设立、牌照申请、后续运营的最新政策规定和操作流程
  20. ESP32S2 桌面时钟

热门文章

  1. 《魔兽3:重制版》 发布PC/Mac最低配置需求
  2. ElementUI自定义组件之地区三级联动
  3. 票据打印控件 票据打印控件
  4. html 一键复制 ios,兼容安卓和ios实现一键复制内容到剪切板
  5. Procast调用外部函数
  6. tophat2安装和问题的解决
  7. 《数据结构》实验报告(四)——二叉树的遍历及相关应用
  8. 2021年低压电工报名考试及低压电工模拟考试题库
  9. Hololens2 Vuforia开发
  10. Python极简讲义——一本书入门数据分析与机器学习(序言)