目录
[1.Spring是什么 ?](#1.Spring是什么 ?)
[6.什么是AOP ?](#6.什么是AOP ?)
1.Spring是什么 ?
- Spring是一款主流的Java EE轻量级开源框架
- 用于简化Java企业级应用的开发难度和开发周期
2.Spring框架中的单例bean是线程安全的吗?
不是线程安全的
当多用户同时请求一个服务时,容器会给每一个请求分配一个线程,这是多 个线程会并发执行该请求对应的业务逻辑(成员方法),如果该处理逻辑中 有对该单列状态的修改(体现为该单例的成员属性),则必须考虑线程同步 问题。
Spring框架并没有对单例bean进行任何多线程的封装处理。
3.IOC容器是什么?
loC-->"控制反转",它不是一门技术,而是一种设计思想
Spring通过loC容器来管理所有Java对象的实例化和初始化,控制对象与对象之间的依赖关系
- 将对象的创建权交出去,交给第三方容器负责
- 将对象和对象之间的关系维护权交出去,交给第三方容器负
4.什么是依赖注入?
- Spring创建对象的过程中,把对象依赖的属性注入到对象中。依赖注入主要有两种方式:构造器注入和set注入。
IOC就是一种思想,DI是对IOC的一种具体实现
6.什么是AOP ?
- aop是面向切面编程,在spring中用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降低耦合,一般比如可以做为公共日志保存,事务处理等
7.IOC容器初始化过程?
- 1.从XML中读取配置文件。
- 2.将bean标签解析成BeanDefinition,如解析property元素,并注入到BeanDefinition实例中。
- 3.将BeanDefinition注册到容器BeanDefinitionMap中。
- 4. BeanFactory 根据 BeanDefinition 的定义信息创建实例化和初始化 bean。
8.Bean的生命周期?
Spring容器在进行实例化时,会将xml配置的<bean>的信息封装成一个BeanDefinition对象,Spring根据BeanDefinition来创建Bean对象,里面有很多的属性用来描述Bean
- 1.bean对象的创建(调用无参构造)
- 2.给bean对象设置相关属性
- 3.bean后置处理器(初始化之前)
- 4.bean对象初始化(调用指定的初始化方法)
- 5.bean后置处理器(初始化之后)
- 6.bean对象创建完成,可以使用了
- 7.bean对象销毁(配置指定的销毁方法)
- 8.IoC容器关闭
9.BeanFactory和FactoryBean的区别?
- BeanFactory:这是 loC 容器的基本实现,是 Spring 内部使用的接口。面向 Sping 本身,不提供给开发人员使用。几乎所有场合都使用ApplicationContext而不是底层的 BeanFactory
- FactoryBean :配置一个FactoryBean类型的bean,在获取bean的时候得到的并不是class属性中配置的这个类的对象,而是getObject()方法的返回值。
10.Bean注入容器有哪些方式?
- 1.@Configuration用来声明一个配置类,然后使用 @Bean 注解,用于声明一个bean,将其加入到Spring容器中
- 2.@ComponentScan放置在我们的配置类上,然后可以指定一个路径,进行扫描带有特定注解的bean,然后加至容器中
11.Spring自动装配的方式有哪些?
自动装配方式一: byType
- byType:根据类型匹配IOC容器中的某个兼容类型的bean,为属性自动赋值
- 若在IOC中,没有任何一个兼容类型的bean能够为属性赋值,则该属性不装配,即值为默认值null.
- 若在IOC中,有多个兼容类型的bean能够为属性赋值,则抛出异常
自动装配方式二:byNam
- byName:将自动装配的属性的属性名,作为bean的id在IOC容器中匹配相对应的bean进行赋值
bean标签里面的 id属性值必须和 自动装配的属性的属性名一致
12.AOP有哪些实现方式?
- AOP有两种实现方式:静态代理和动态代理。
静态代理
- 静态代理:代理类在编译阶段生成,在编译阶段将通知织入Java字节码中,也称编译时增强。AspectJ使用的是静态代理。
- 缺点:代理对象需要与目标对象实现一样的接口,并且实现接口的方法,会有冗余代码。同时,一旦接口增加方法,目标对象与代理对象都要维护。
动态代理
- 动态代理:代理类在程序运行时创建,AOP框架不会去修改字节码,而是在内存中临时生成一个代理对象,在运行期间对业务方法进行增强,不会生成新类。
13.Spring通知有哪些类型?
- 前置通知(Before):在目标方法被调用之前调用通知功能;
- 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么;
- 返回通知(After-returning ):在目标方法成功执行之后调用通知;
- 异常通知(After-throwing):在目标方法抛出异常后调用通知;
- 环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的逻辑。
14.Spring中的事务是如何实现的?
- spring实现的事务本质就是aop完成,对方法前后进行拦截,在执行方法之前 开启事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
15.Spring中事务失效的场景有哪些?
- ① 异常捕获处理,自己处理了异常,没有抛出,解决:手动抛出
- ②抛出检查异常,配置rollbackFor属性为Exception
- ③非public方法导致的事务失效,改为public
16.Spring中的循环引用?
循环依赖:循环依赖其实就是循环引用,也就是两个或两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于A
循环依赖在spring中是允许存在,spring框架依据三级缓存已经解决了大部分的循环依赖
- ① 一级缓存:单例池,缓存已经经历了完整的生命周期,已经初始化完成的bean对象
- ② 二级缓存:缓存早期的bean对象(生命周期还没走完)
- ③三级缓存:缓存的是ObjectFactory,表示对象工厂,用来创建某个对象的
解决方案
- 使用@Lazy进行懒加载,什么时候需要对象再进行bean对象的创建