1.Spring框架中用到了哪些设计模式?
1:代理模式——AOP的增强
2:单例模式——在Spring配置文件中定义的Bean默认为单例模式
3:工厂模式——BeanFactory用来创建对象的实例
4:模板方法——用来解决代码重复问题。比如RestTemplate
2.对于SpringIOC和依赖注入DI的理解
IOC: IOC就是控制反转。就是对象的创建权反转交给Spring,用容器控制程序之间的依赖关系,作用是解除耦合。
DI依赖注入: 可以说是IOC的其中一个类容,在容器实例化对象的时候主动的将被调用者(或者说它的依赖对象)注入给调用对象。
注入方式: 构造方法注入,Set方法注入,P和C名称空间方法注入,SPEL方法注入,注解注入。
3.BeanFactory和ApplicationContext有什么区别?
BeanFactory和ApplicationContext是Spring的两大核心接口,而其中ApplicationContext是BeanFactory的子接口。它们都可以当作Spring的容器,生成Bean实例,并管理容器中的Bean。
4.Spring支持的几种Bean的作用域?
Spring容器中的Bean分为5个范围:
1:singleton:这种bean的范围是默认的,这种范围确保不管接收到多少个请求,每个容器只有一个bean的实例,单例模式有beanfactory自身来维护。
2:prototype:原形范围,与单例范围相反,为每一个bean请求提供一个实例。
3:request:在请求bean范围内会为每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效被垃圾回收器回收。
4:Session:确保每一个session中又一个bean的实例,在Session过期后,bean会随着消失。
5:global-Session:global-session和Portlet应用相关。当你的应用部署在Portlet容器工作时,它包含很多portlet。如果你想要声明让所有的portlet公用全局的存储变量的话,那么这全局变量需要存储在global-session中。全局作用域与Servlet中的Session作用域相同。
5.谈谈你对SpringAOP的理解
AOP,一般称为面向方面(切面)编程,作为面向对象的一种补充,用于解剖封装好的对象内部,找出其中对多个对象产生影响的公共行为,并将其封装为一个可重用的模块,这个模块被命名为“切面" (Aspect) ,切面将那些与业务无关,却被业务模块共同调用的逻辑提取并封装起来,减少了系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证、日志、事务处理。
AOP实现的关键在于AOP框架自动创建的AOP代理, AOP代理主要分为静态代理和动态代理。静态代理的代表为Aspect):动态代理则以Spring AOP为代表。
(1) Aspect是静态代理的增强,所谓静态代理,就是AOP框架会在编译阶段生成AOP代理类,因此也称为编译时,增强,他会在编译阶段将Aspect织入到ava字节码中,运行的时候就是增强之后的AOP对象。
(2) Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法,
Spring AOP中的动态代理主要有两种方式, JDK动态代理和CGLIB动态代理:
1.JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类。生成的代理对象的方法调用都会委托到InvocationHandler.invoke0方法,当我们调用代理类对象的方法时,这个"调用"会转送到invoke方法中,代理类对象作为proxy参数传入,参数method标识了我们具体调用的是代理类的哪个方法, args为这个方法的参数。
2.如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类.CGLIB (CodeGeneration Library) ,是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法,覆盖方法时可以添加增强代码,从而实现AOP, CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLB做动态代理的。
(3)静态代理与动态代理区别在于生成AOP代理对象的时机不同,相对来说Aspect的静态代理方式具有更好的性能,但是Aspect需要特定的编译器进行处理,而Spring AOP则无需特定的编译器处理