1详细描述什么是Spring?
Spring是一个轻量级的,开源设计框架,核心是IOC和AOP,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用
优点 :
-
spring如同一个工厂, 将所有的对象创建和销毁JavaBean交给spring管理,降低了对象之间的耦合性
-
集成各种优秀的框架 , 封装了java EE中的一些难用的API , 降低了开发的难度
-
同时spring支持JUnit4 , 可以通过注解方便测试spring程序
-
支持AOP编程,可方便的实现对程序进行权限和运行监控
-
声明式事务支持 , 通过配置就可以完成对事务的管理
缺点:
1.使用门槛升高,入门Spring需要较长时间;
2.对过时技术兼容,导致复杂度升高;
3.使用XML进行配置,但已不是流行配置方式;
4.集成第三方工具时候需要考虑兼容性;
5.系统启动慢,不具备热部署功能,完全依赖虚拟机或Web服务器的热部署。
2什么是Spring IOC?
概念:控制反转 , 将设计好的对象交给spring管理
优点:降偶 , 资源集中管理 , 提高复用性
Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对 象的整个生命周期。
3.什么是Spring AOP?描述其应用场景(最少2个)
概念:面向切面编程 , 通过预编译的方式和运行期动态代理 , 实现不修改代码 , 给应用添加统一功能,也可以利用AOP对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率
应用: 事务 , 日志 , 缓存等
4.AOP的通知有几个,分别是什么
- 前置通知:before在连接点之前执行,不会影响连接点执行除非抛出异常
- 后置通知:after**在连接点之后执行,连接点抛出异常,则不执行
- 返回通知:after-returning在连接点执行后执行,不管是否抛出异常都会执行
- 异常通知:after-throwing**连接点之后执行,连接点抛出异常则执行
- 环绕通知:around**环绕在连接点前后执行
5.描述Spring Bean的作用域?
- singleton:在spring容器中只存在一个bean实例,为默认值,单例模式
- prototype:每次从spring中调用都会创建一个新的实例,多例模式
- request:HTTP请求都会创建一个新的bean,适用于WebApplicationContext环境
- session:**同一个HTTPsession共享一个Bean,不同的session使用不同的Bean,适用于WebApplicationContext环境
application:绑定一个bean的作用域为selevelContent的生命周期,该作用域只适用于web的spring webapplicationcontent环境
6.Spring Bean 注入有几种方式?
-
构造器注入:通过在bean的构造方法中将bean注入
-
setter注入:在bean的set方法中注入
-
工厂方法注入:通过方法返回值注入
什么时候用 SET注入、什么时候构造器注入?
从bean生命周期:
实例化BEAN:构造器
SET注入属性赋值 set注入
7.SpringBean 生命周期?
实例化BEAN
(前置处理器)
init()初始化方法
(后置处理器)
SET注入属性赋值
使用目标方法
destrory()方法
<bean id="a" class="org.A"> <property name="name" value="123"></property> </bean> <bean id="b" class="org.B"> <property name="name" value="123"></property> </bean> 1 A实例化BEAN 2 SET赋值 3、使用BEAN 4、B实例化BEAN 5、SET赋值 6、使用BEAN 有依赖关系 <bean id="a" class="org.A"> <property name="name" value="123"></property> <property name="b" ref="b"></property> </bean> <bean id="b" class="org.B"> <property name="name" value="123"></property> <property name="a" ref="A"></property> </bean> 1.A实例化BEAN 2.B实例化BEAN 。。。
1、Spring 容器根据配置中的 bean 定义中实例化 bean。
2、Spring 使用依赖注入填充所有属性,如 bean 中所定义的配置。
3 .如果 bean实现BeanNameAware 接口,则工厂通过传递 bean的 ID来调用setBeanName()
4 、如果 bean 实现 BeanFactoryAware 接口,工厂通过传递自身的实例来调用 setBeanFactory()
5、如果存在与 bean 关联的任何 BeanPostProcessors,则调用 preProcessBeforeInitialization()
方法。
6、如果Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。
7 、 最 后 , 如 果 存 在 与 bean 关 联 的 任 何 BeanPostProcessors , 则 将 调 用
postProcessAfterInitialization() 方法。
8、如果 bean 实现 DisposableBean 接口,当 spring 容器关闭时,会调用 destory()。
9、如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。
8.Spring框架中 用到了哪些设计模式?(不低于3个)
代理模式,在 AOP 中被使用最多。
单例模式,在 Spring 配置文件中定义 bean 的时候默认的是单例模式。
工厂模式, BeanFactory 用来创建对象的实例。
模板方法, 用来解决重复性代码。 前端控制器,Spring 提供了 DispatcherSerclet 来对请求进行分发。视图帮助,Spring 提供了一系列的 JSP 标签。
依赖注入,它是惯穿于 BeanFactory/ApplicationContext 接口的核心理念。
设计模式:前人的经验总结。
设计一种思想,有来简化软件开发。提高代码复用率。
框架:
定义:一系列类、方法、接口的集成。
作用:简化代码开发,提高开发效率。减少BUG产生。
9.描述Spring事务传播行为?
PROPAGATION(蔓延、传播、传输)
proparation+** 如下七种前面加这个单词
- required:**默认传播行为,有事务加入事务,没有事务创建一个
- required_New:**不管事务是否存在,都创建一个新的事务,先执行新事务,原事务挂机,稍后执行
- supports:**为调用此方法的bean声明事务,否则就不用声明事务
- Notsupported:**容器不为这个方法开启事务
- mandatory:**必须在一个已有事务中执行,否则抛出异常
- Never:**必须在一个没有事务中执行,否则抛出异常
- Nested:**如果当前事务存在,则嵌套事务内执行(如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。)
10.描述Spring事务的隔离级别?
- isolation-default:默认传播行为
- isolation-read-uncommitted:读未提交
- isolation-read-commit:读已提交
- isolation-repeatable-read:可重复读
- isolation-serializable:序列化读
11.Spring事务传播行为 REQUIRED和REQUIRED_NEW区别
@Transactional` 注解来实现(底层用的是AOP机制)–》
1、注解声明在 接口(public方法修饰)、类上(当前所有的public方法)、方法上。
2、PROPAGATION_REQUIRED 和REQUIRES_NEW 的区别?
PROPAGATION_REQUIRED (默认)
- 支持当前事务,如果当前没有事务,则新建事务
- 如果当前存在事务,则加入当前事务,合并成一个事务
REQUIRES_NEW (REQUIRES_NEW
一般用在子方法需要单独事务)
- 新建事务,如果当前存在事务,则把当前事务挂起
- 这个方法会独立提交事务,不受调用者的事务影响,父级异常,它也是正常提交
3、 aop 来代理事务控制 ,是针对于接口或类的,所以在同一个 service 类中两个方法的调用,传播机制是不生效的。
a:需要将两个方法分别写在不同的类里。
b:调用B方法的时候,将service自己注入自己,用这个注入对象来调用B方法。
12.数据库设计三大范式?
1.第一范式:
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
2.第二范式:
第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
3.第三范式:
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
13.软件开发生命周期?
软件生命周期内有问题定义、可行性分析、总体描述、系统设计、编码、调试和测试、验收与运行、维护升级到废弃等阶段
14.说一下DTO和PO的区别?以及优缺点?
PO(Persistent Object):持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应PO的一个(或若干个)属性。
DTO(Data Transfer Object):数据传输对象,减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。
DTO代表服务层需要接收的数据和返回的数据