spirng面试

在这里插入图片描述

什么是spring框架?

spring是一个轻量级的开源框架,是为了解决企业开发应用程序的复杂性而创建的。
优势:

  • 分层架构(三层):

web层:SpringMVC
业务层:SpringIOC
持久层:Springde JDBC,Mybatis等持久层框架。

  • 解耦:将对象之间的依赖关系交由spring进行控制。

Spring核心:控制反转(IOC)和面向切面编程(AOP)。

说说IOC以及实现原理?

IOC是控制反转,以前我们实例化对象要用new关键字来创建对象,但是现在我们将实例化对象的工作交给spring的IOC容器,我们想要什么对象只要跟IOC容器说就行了。
还有与IOC相同概念的依赖注入(DI):IOC的一个重点是在系统运行中,动态的向某个对象提供它所需要的的其他对象,这正是通过DI实现。比如对象A需要操作数据库,不用spring的情况下我们需要实例化一个connection对象,有了spring后我们就只需要告诉spring,A需要一个connection,至于这个connection对象怎么么构造,何时构造,A不需要知道,在系统运行的时候,spring会在合适的时候制造一个connection,然后注入到A中。
IOC(DI)实现原理:
使用hashmap保存配置信息,Hashmap的key是标签的id,,Hashmap的value就是这个bean。
然后通过反射机制将对象注入。在实例化一个类时,通过反射调用类的set方法将事先保存在hashmap的类属性注入到类中。最后返回这个类的实例给我们。
具体参考:IOC(DI)实现原理

AOP:

aop就是面向切面的编程。比如说你每做一次对数据库操作,都要生成一句日志。如果,你对数据库的操作有很多类,那你每一类中都要写关于日志的方法。但是如果你用aop,那么你可以写一个方法,在这个方法中有关于数据库操作的方法,每一次调用这个方法的时候,就加上生成日志的操作。
实际上 AOP 的应用是指在不改动源代码的情况下,灵活添加业务逻辑实现.
例如:
一个项目中存在N多个save()方法, 如果,现在项目有一个需求,比如在保存完成之前后者之后,需要记录日志操作,如果不用AOP,你需要找到每个类里面的
save方法,然后添加响应的代码,费时费力并且后期也不好维护,如果引用AOP技术,只需要自定义一个方法,在spring配置文件中将该方法配置好,当每次调用完原先的save方法时,都会去执行你写的保存日志方法。这样就能减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
实现原理:动态代理+反射机制
为什么要引入代理?
引入代理:

我们为什么要引入java的代理,除了当前类能够提供的功能外,我们还需要补充一些其他功能。

最容易想到的情况就是权限过滤,我有一个类做某项业务,但是由于安全原因只有某些用户才可以调用这个类,此时我们就可以做一个该类的代理类,要求所有请求必须通过该代理类,由该代理类做权限判断,如果安全则调用实际类的业务开始处理。

可能有人说为什么我要多加个代理类?我只需要在原来类的方法里面加上权限过滤不就完了吗?

在程序设计中有一个类的单一性原则问题,这个原则很简单,就是每个类的功能尽可能单一。为什么要单一,因为只有功能单一这个类被改动的可能性才会最小。

如果你将权限判断放在当前类里面,当前这个类就既要负责自己本身业务逻辑、又要负责权限判断,那么就有两个导致该类变化的原因,现在如果权限规则一旦变化,这个类就必需得改,显然这不是一个好的设计。
同时,使用代理还可以将两个类的关系解耦。
静态代理:
在这里插入图片描述由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。
缺点:代理类和委托类都实现同一个接口,并且代理类通过委托类实现了相同的方法,这样就出现了大量代码重复。
同时代理对象只能服务一种类型的对象,要服务多种类型的对象,那么就要为每一种对象进行代理。这样在项目庞大时非常麻烦了。
动态代理:在程序运行时运用反射机制动态创建而成。
动态代理就是为了解决一种委托类需要一个代理类的问题,通过动态代理,可以用一个代理类完成多个类的代理。
实现:详情
在这里插入图片描述
Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces, InvocationHandler h)方法是入口,
方法的第一个参数ClassLoader是类加载器,作用是用来生成类对象的;
第二个参数interfaces是获取真实对象的所有接口,因为代理类要实现所有的接口。
第三个参数是InvocationHandler是调用处理器,调用它的原因是生成的代理不能直接调用真实对象的方法,通过调用处理器来调用真实对象的方法(使用invoke (Object proxy, Method method, Object[] args))方法将)。
nvoke (Object proxy, Method method, Object[] args)
proxy:指我们所代理的那个真实的对象;
method:指我们要调用真实对象的某个方法的Method对象;
args:指的是调用真实对象某个方法的参数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值