文章目录
JavaEE
spring(一)
spring框架
请谈一谈Spring中自动装配的方式有哪些?
byName:通过Bean对象的id进行查找
byType:通过Bean的class类型进行查找
Constructor:通过构造器的参数进行装配
no:不进行自动装配,手动装配来实现
autodetect:如果有默认的构造器则使用Constructor,如果没有则使用byType
补充
Bean的生命周期:
-
实现BeanNameAware接口但没有使用Bean的后置处理器
-
给属性赋值(set())
-
此时实现了BeanNameAware,会将Bean的id通过BeanNameAware自带的setName(),传入
-
初始化bean
-
调用bean的方法(即此时的测试方法)
-
销毁bean
在Xml中配置
- init-method:指定初始化的方法
- destroy-method:指定销毁的方法
-
-
实现BeanNameAware接口和使用Bean的后置处理器
- 给属性赋值(set())
- 此时实现了BeanNameAware,会将Bean的id通过BeanNameAware自带的setName(),传入
- 调用前置处理器,输出name属性的值【作为测试要求】
- 初始化bean
- 调用后置处理器,修改了name属性的值
- 因为修改了属性的值,因此再次调用set(),给属性赋值
- 调用bean的方法(即此时的测试方法)
- 销毁bean
请问Spring中Bean的作用域有哪些?
prototype:原型模式
- 在创建容器的时候不会去创建bean,只用每次getBean()时才会创建一个新的bean
singleton:单例模式,只会创建一个对象,每次都是从此对象中进行获取
- 在创建容器的时候就会创建一个bean,每次getBean(),只是从容器中直接获取
在weApplicationbContext才会有的
- request:在每次的Http请求都会创建一个新的request
- session:在同一个Http Session中会使用同一个session,但当关闭此会话,就会创建新的session
- application:在整个ServletContext中使用一个application
请说明一下Spring中BeanFactory和ApplicationContext的区别是什么?
BeanFactory是spring容器原始的factory,当我们去获取bean的时候并不会创建对象,只有使用了getBean()才会创建对象,不支持web,aop等spring插件;ApplicationContext实现了BeanFactory接口,并且当获取bean的时候就可以创建对象,而且还支持许多插件,因此几乎所有场合都可以用ApplicationContext来实现
控制反转
请问什么是IoC和DI?并且简要说明一下DI是如何实现的?
IOC是控制反转,将创建一个对象的主动性变为被动的
DI依赖注入,可以理解为是控制反转的一种表现,因为IOC主要实现创建对象权的反转,此时就需要将所用的对象,或者所需的对象的属性通过依赖注入传给所用的对象
spring
请说明一下springIOC原理是什么?如果你要实现IOC需要怎么做?请简单描述一下实现步骤?
将对象的创建权由主动变为被动接收
请简单说明一下依赖注入的方式有哪几种?以及这些方法如何使用?
set方法
<bean id="address" class="com.wjq.pojo.Address">
<property name="address" value="sh"/>
</bean>
构造器方法
<bean id="user" class="com.wjq.pojo.User">
<constructor-arg index="0" value="aaa"/>
<!--<constructor-arg type="java.lang.String" value="bbb"/>
<constructor-arg name="name" value="ccc"/>-->
</bean>
p命名空间
c命名空间
<!-- 通过p命名空间实现 p=property-->
<bean id="user" class="com.wjq.pojo.User" p:name="www" p:age="20"/>
<!-- 通过c命名空间,需要有参构造器 c=construct-args-->
<bean id="user1" class="com.wjq.pojo.User" c:name="qqq" c:age="10"/>
</beans>
请说明一下@Controller和@RestController的区别是什么?
- Controller会经过视图解析器
- RestController(ResponseBody+Controller)不会经过视图解析器,将返回的json字符串显示到指定页面上
请问在以前的学习中有使用过Spring里面的注解吗?如果有请谈一下autowired 和resource区别是什么?
- autowired
- 是根据通过byType进行自动装配的
- 设置其required属性,来保证对象是否可以为null,true是不能为null,false是可以为null
- 如果还想根据name进行装配可以配合使用Qualifier()
- resource
- 是先根据byName再根据byType进行自动装配的
- 其内有两个属性,如果指定了name,则按照byName,如果指定了type,则根据byType,如果没有指定则是先根据byName再根据byType进行自动装配的
- 是属于Java的而不属于Spring
请介绍一下bean的生命周期
Bean的生命周期:
-
实现BeanNameAware接口但没有使用Bean的后置处理器
-
给属性赋值(set())
-
此时实现了BeanNameAware,会将Bean的id通过BeanNameAware自带的setName(),传入
-
初始化bean
-
调用bean的方法(即此时的测试方法)
-
销毁bean
在Xml中配置
- init-method:指定初始化的方法
- destroy-method:指定销毁的方法
-
-
实现BeanNameAware接口和使用Bean的后置处理器
- 给属性赋值(set())
- 此时实现了BeanNameAware,会将Bean的id通过BeanNameAware自带的setName(),传入
- 调用前置处理器,输出name属性的值【作为测试要求】
- 初始化bean
- 调用后置处理器,修改了name属性的值
- 因为修改了属性的值,因此再次调用set(),给属性赋值
- 调用bean的方法(即此时的测试方法)
- 销毁bean
spring(二)
spring
请简要说明一下IOC和AOP是什么?
-
IOC:控制反转
- 将对象的创建的权力由主动创建变为被动注入
- set()注入
- 构造器注入
- 注解注入
- 同时也降低了代码之间的耦合度,因为对象的创建可以由IOC容器来创建
- 将对象的创建的权力由主动创建变为被动注入
-
AOP:面向切面
- 面向切面的编程,对于像一些事务,安全等我们可以通过织入的方式将其插入到所要用的地方,降低程序之间的耦合度,提高代码的重用性
请简单谈一下spring框架的优点都有哪些?
可以让程序员更加专注于业务逻辑的代码,不用再编写一些繁琐的底层代码,同时将程序的耦合度降低,可以实现代码的复用
-
Spring是一个开源的免费的框架(容器)
-
Spring是一个轻量级的非入侵式的框架
-
控制反转(IOC),面向切面编程(AOP)
-
支持事务处理,对框架的整合处理
总结:Spring就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架
请简单介绍一下spring?
spring是一个轻量级的IOC和AOP的容器,可以实现
-
核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。
BeanFactory
使用控制反转(IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。 - Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
- Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
- Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
- Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
- Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
- Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。
事物管理
请问Spring支持的事务管理类型有哪些?以及你在项目中会使用哪种方式?
编程式事务和声明式事务
声明式事务
事务
-
事务具备的四种特性:ACID
- 原子性:事务的执行要么全部成功,要么全部失败,不会存在中间状态
- 一致性:数据库在事务执行前后都处于一致状态,如果事务执行成功,那么所有的变化都是成功后的状态,如果失败,那么所有的变化都是回滚后的
- 隔离性:在并发状态下,每个事务对数据的操作都是互不影响的
- 持久性:如果事务操作成功,那么即使数据库崩了,但是对数据是不会有影响的
-
事务的传播
- required:如果当前事务存在,执行;不存在,创建新的事务(spring默认)
- supports:支持当前事务存在;不存在,以非法事务方法执行
- mandatory:使用当前事务;不存在,抛出异常
- required_new:当前事务存在,挂起,创建新的事务
- not_supported:以非法事务方法执行,当前事务存在,挂起
- never:以非法事务方法执行,当前事务存在,抛出异常
- nested:如果当前事务存在,则嵌套在当前事务内执行;不存在,按照required执行
-
脏读:在一个事务中对某一数据进行修改后但并未提交,此时另外一个事务也来访问,此时读到的数据是未提交之间的脏数据
-
不可重复读:在一个事务中在对某一数据修改之前读在修改之后又读,此时前后两次获得的数据是不一样的
-
幻读:没有说必须在同一事务中,在插入数据的过程中,前后两次查询的数据结果是不一样的
-
事务的隔离
-
DEFAULT:spring使用的默认隔离级别
-
READ UNCOMMITED:未提交之前可以读取数据,会造成脏读,不可重复读,幻读
-
READ COMMITED:提交以后读取数据,防止脏读
-
REPEATABLE READ:可以防止脏读和不可重复读
-
SERIALIZABLE:可以防止脏读,不可重复读以及幻读
Mysql默认REPEATABLE READ;oracle默认READ COMMITED
-
AOP
你如何理解AOP中的连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、引介(Introduction)、织入(Weaving)、切面(Aspect)这些概念?
- 连接点(Joinpoint)
- 拥有边界性质的特定点,特定点可以理解为方法调用的前后
- 切点(Pointcut)
- 是一个方法或者类,即要在哪个方法或者类周围实现我们要增强,切点插入的地方就是程序的连接点
- 增强(Advice)
- 方法,即我们所要实现的添加,可以在方法或者类的前后
- 引介(Introduction)
- 一种特殊的增强
- 织入(Weaving)
- 横向切入,将切面代码插入到目标对象说
- 切面(Aspect)
- 是切点和通知结合在一起,即要实现横向切入的类
请问aop的应用场景有哪些?
事务、缓存、日志
动态代理
请问AOP的原理是什么?
将要添加的通知通过横向织入的方法增加到我们要实现的类或者方法的前后,其底层实现还是通过动态代理实现的,将原代码通过代理,将将横切关注点,包装在原代码上,实现我们的增强
AOP分为静态代理和动态代理,AspectJ是静态代理的增强;Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理
框架
请说明一下Spring框架为企业级开发带来的好处有哪些?
- IOC:通过对IOC的应用可以解决手动创建对象的实现,将对象的创建权由主动创建转变为注入
- AOP:可以实现横向切入,即不用改动原来的代码,增加自己想要的通知
- 非侵入式框架:即不需要继承框架中的类,降低了耦合度
请问Struts拦截器和Spring AOP有什么区别?
struts2 拦截器采用xwork2的interceptor
spring AOP的拦截器是基于IOC的,而IOC底层是由动态代理与cglib实现的
请问持久层设计要考虑的问题有哪些?请谈一下你用过的持久层框架都有哪些?
数据库的正确连接;对应的pojo的编写;数据库表的设计不要过多,否则会影响效率;注意数据库连接时的开销
Mybatis
SQL
请问MyBatis中的动态SQL是什么意思?
可以根据条件动态的生成需要的sql语句,因为在面临复杂的sql语句时,进行拼接会容易出错
Mybatis
请说明一下MyBatis中命名空间(namespace)的作用是什么?
命名空间就相当于平时写jdbc时这个类实现了哪个父类的什么接口,即实现的dao(mapper)接口,spring会自动帮我们绑定这个接口;也可以有效的防止命名的冲突
MVC
设计模式
请谈一下Spring MVC的工作原理是怎样的?
在springMVC中有两个重要的类处理器映射和处理适配器
- 首先DispatcherServlet会拦截所有的servlet请求
- 处理器映射会根据url找到处理器handler,再找到controller,返回给DispatcherServlet
- 处理适配器会执行controller,得到视图模型(ModelAndView),将视图模型返回给DispatcherServlet
- DispatcherServlet用视图解析器(ViewResolver)进行解析,生成对应的视图,传给DispatcherServlet
- 视图进行渲染返回给用户浏览器,最后呈现给用户
spring
请简述一下SpringMVC的运行机制?以及运行机制的流程是什么?
在springMVC中有两个重要的类处理器映射和处理适配器
- 首先DispatcherServlet会拦截所有的servlet请求
- 处理器映射会根据url找到处理器handler,再找到controller,返回给DispatcherServlet
- 处理适配器会执行controller,得到视图模型(ModelAndView),将视图模型返回给DispatcherServlet
- DispatcherServlet用视图解析器(ViewResolver)进行解析,生成对应的视图,传给DispatcherServlet
- 视图进行渲染返回给用户浏览器,最后呈现给用户
请说明一下springmvc和spring-boot区别是什么?
springMVC是基于spring的一个web框架,spring-boot是将spring中反射繁琐的配置文件变为自动配置,降低了项目搭建的复杂度
spring MVC
请说明一下Spring MVC注解的优点是什么?
- 可以简化复杂的xml编写,提高编写的效率,将等多注意放在业务逻辑的处理上
- 其次xml只有在运行期间才会发现错误,可以提前检测安全
各种框架对比与项目优化
框架
请简单介绍一下你了解的Java领域中的Web Service框架都有哪些?
Java领域的Web Service框架很多,包括Axis2(Axis的升级版本)、Jersey(RESTful的Web Service框架)、CXF(XFire的延续版本)、Hessian、Turmeric、JBoss SOA等,其中绝大多数都是开源框架。
请简述一下Mybatis和Hibernate的区别是什么?
- mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大
- Hibernate对象/关系映射能力强,数据库无关性好