aop/ioc

阿王 2022-09-25 13:08:58 17422 0 0 0

F1、类的反射机制有啥用?

(1)增加程序的灵活性,可扩展性,动态创建对象。
(2)框架必备,任何框架的封装都要用反射。(框架的灵魂)

F2、获取Class对象的三种方式?

(1)Class.forName();
(2)类名.class;
(3)对象.getClass();

F3、Java创建对象的方式有哪些?

(1)new 关键字。
(2)使用类的反射机制
(3)使用类的clone
(4)采用反序列化机制

F4、对于IOC你是怎么理解的?

IoC(Inversion of Control)翻译过来是控制翻转,是一种设计思想,将创建对象的权力交给spring容器去控制,用来创建和管理bean
(1)改变了创建对象的方式和获取资源的方式
容器控制应用程序的对象创建,实例化,和对象之间的依赖
程序不能主动获取外部资源了,而是ioc容器给他注入,

F5、讲解你对Spring依赖注入的理解?

(1)因为程序需要运行这些外部资源,所以依赖注入就是给对象中的属性赋值

F7、Spring对象常用的注入方式(DI)?

(1)setter注入
(2)构造方法注入
(3)基于注解的方式注入

F8、@Autowired 与@Resource?

(1)相同点:
@Autowired和@Resource功能相同,都可以用来装配bean;
两个注解可以加载属性字段或写在setter方法上;
(2)不同点:
提供方不同:@Autowired是Spring框架提供,@Resource是Jdk自带
装配方式不同:
@Autowired默认按照byType装配;
@Resource默认按照byName装配,如果匹配不到,则继续使用byType装配;

F9、Spring Bean的作用域?

当通过Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。Spring支持如下5种作用域:

singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例

prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例

request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效

session:对于每次HTTP Session,使用session定义的Bean都将产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效

globalSession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效

F10、BeanFactory和FactoryBean的区别?

(1)BeanFactory:是一个工厂,IOC的顶级接口,用来管理和获取Bean对象。
(2)FactoryBean:是一个Bean生成工具,是用来获取一种类型对象的Bean,它是构造Bean实例的一种方式。用户可以通过实现该接口定制实例化 Bean 的逻辑。

F11、bean生命周期有哪些?

总体可以分为六个阶段:

Bean定义
实例化
属性赋值
初始化
生存期
销毁

F13、Spring如何解决循环依赖问题?

Spring是通过三级缓存机制来解决Bean创建的循环依赖问题的,具体如下:
(1)一级缓存,singletonObjects,存储所有已创建完毕的单例 Bean (完整的 Bean)。
(2)二级缓存,earlySingletonObjects,存储所有仅完成实例化,但还未进行属性注入和初始化的 Bean。
(3)三级缓存,singletonFactories,存储能建立这个 Bean 的一个工厂,通过工厂能获取这个 Bean,延迟化 Bean 的生成,工厂生成的 Bean 会塞入二级缓存。

具体流程如下:
(1)A创建过程中需要B,于是A将自己放到三级缓存里面,去实例化B
(2)B实例化的时候发现需要A,于是B先查一级缓存,没有,再查二级缓存,还是没有,再查三级缓存,找到了A然后把三级缓存里面的这个A放到二级缓存里面,并删除三级缓存里面的A
(3)B顺利初始化完毕,将自己放到一级缓存里面(此时B里面的A依然是创建中状态)然后回来接着创建A,此时B已经创建结束,直接从一级缓存里面拿到B,然后完成创建,并将A放到一级缓存中。

AOP

F14、什么是AOP?

面向切面编程,一种编程思想,在不改变原有的逻辑的基础上,增加一些额外的功能。

F15、AOP的应用场景有哪些?

(1)权限验证
(2)日志跟踪
(3)事务
(4)读写分离

F16、AOP的通知方式有哪些?

(1)前置通知:在我们执行目标方法之前运行(@Before)
(2)后置通知:在我们目标方法运行结束之后,不管有没有异常(@After)
(3)返回通知:在我们的目标方法正常返回值后运行(@AfterReturning)
(4)异常通知:在我们的目标方法出现异常后运行(@AfterThrowing)
(5)环绕通知:非常灵活,目标方法的调用由环绕通知决定,即你可以决定是否调用目标方法,joinPoint.procced()就是执行目标方法的代码 。环绕通知可以控制返回对象(@Around)

F17、AOP底层的实现原理?

AOP底层是通过动态代理实现,两种实现方式:
(1)jdk动态代理:如果目标对象实现了接口,spring默认会使用jdk动态代理实现。
(2)cglib动态代理:如果目标对象没有实现接口,spring默认使用cglib代理实现。
可以强制使用cglib

F18、jdk动态代理和cglib动态代理区别?

(1)jdk动态代理只能对实现了接口的类生成代理,而不能针对类。cglib是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法(继承)。

(2)在低版本的jdk(jdk1.7之前),cglib代理的效率要比jdk动态代理的效率高。在jdk1.7,1.8及之后的版本对jdk动态代理做了优化,jdk动态代理效率要高于cglib代理。

F19、SpringMVC常用注解有哪些?

(1)@Controller和@RestController
(2)@RequestMapping
(3)@PathVariable
(4)@RequestParam
(5)@RequestBody
(5)@ResponseBody

F28、Spring bean自动装配有哪些方式?

(1)no - 这是默认设置,表示没有自动装配。应使用显式 bean 引用进行装配。
(2)byName - 它根据 bean 的名称注入对象依赖项。它匹配并装配其属性与 XML文件中由相同名称定义的 bean。
(3)byType - 它根据类型注入对象依赖项。如果属性的类型与 XML 文件中的一个 bean 名称匹配,则匹配并装配属性。
(4)构造函数- 它通过调用类的构造函数来注入依赖项。它有大量的参数。
(5)autodetect - 首先容器尝试通过构造函数使用 autowire 装配,如果不能,则尝试通过 byType 自动装配。

F29、Spring 框架中都用到了哪些设计模式?

工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
单例模式:Bean默认为单例模式。
代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新

F30、Spring基于xml注入bean的几种方式

Set方法注入;
构造器注入:
静态工厂注入;
实例工厂;

F36、@Component, @Controller, @Repository, @Service 有何区别?

@Component:这将 java 类标记为 bean。它是任何 Spring 管理组件的通用构造型。spring 的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中。

@Controller:这将一个类标记为 Spring Web MVC 控制器。标有它的 Bean 会自动导入到 IoC 容器中。

@Service:此注解是组件注解的特化。它不会对 @Component 注解提供任何其他行为。您可以在服务层类中使用 @Service 而不是 @Component,因为它以更好的方式指定了意图。

@Repository:这个注解是具有类似用途和功能的 @Component 注解的特化。它为 DAO 提供了额外的好处。它将 DAO 导入 IoC 容器,并使未经检查的异常有资格转换为 Spring DataAccessException。

42、说一下Spring的事务传播行为

(1)如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。
(2)支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。
(3)支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
(4)创建新事务,无论当前存不存在事务,都创建新事务。
(5)以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
(6)以非事务方式执行,如果当前存在事务,则抛出异常。
(7)如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。