最新总结Spring知识及常见面试题
1. 什么是spring?
Spring是一个开源、分层javaSE/javaEE的一站式轻量级解决方案。[容器框架]
2. 使用Spring框架的好处是什么?
解决业务逻辑层【Service】与web层和数据访问层之间的松耦合问题。
3. Spring由哪些模块组成?
4. 什么是Spring IOC 容器?
IoC(Inverse of Control 反转控制): 将java对象创建和维护权利交由Spring工厂进行管理和维护。
5. IOC的优点是什么?
java对象创建和维护权利交由Spring工厂进行管理和维护。
6. 什么是BeanFactory ? BeanFactory 实现举例。
BeanFactory接口表示一个Spring工厂对象【Spring容器对象】,包含了实例化好的java类对象。【管理】
BeanFactory接口有一个常用的子接口ApplicationContext接口,我们通常使用ApplicationContext接口充当Spring工厂对象【Spring容器对象】。
1.ClassPathXmlApplicationContext类 – new ClassPathXmlApplicationContext()可以创建出BeanFactory接口对象/ApplicationContext对象
表示:通过查找类路径加载一个Xml文件创建Spring工厂对象
2. FileSystemXmlApplicationContext类 —new FileSystemXmlApplicationContext可以创建出BeanFactory接口对象/ApplicationContext对象
表示:通过在系统文件类路径中加载一个Xml文件创建Spring工厂对象
7. ApplicationContext怎么实现?
1.ClassPathXmlApplicationContext类 – new ClassPathXmlApplicationContext()可以创建出BeanFactory接口对象/ApplicationContext对象
表示:通过查找类路径加载一个Xml文件创建Spring工厂对象
2.FileSystemXmlApplicationContext类 —new FileSystemXmlApplicationContext可以创建出BeanFactory接口对象/ApplicationContext对象
表示:通过在系统文件类路径中加载一个Xml文件创建Spring工厂对象
8. BeanFactory和 Applicationcontexts 有什么区别?
ApplicationContext接口是BeanFactory接口的子接口,都是Spring容器对象。
9. spring配置bean实例化有哪些方式?
(1) 无参数构造方法(开发最常用)
(2) 静态工厂方法实例化bean
//需要创建一个静态工厂
package com.wangxing.spring.bean;
public class StaticFactryMethodClass {//创建静态方法public static Student getStudentObj(){return new Student();}
}
(3) 实例工厂方法实例化bean
//需要创建一个实例工厂
package com.wangxing.spring.bean;
public class FactoryMethodClass {//创建实例方法public Student getStudentObj(){return new Student();}
}
<!-- 实例工厂方法配置 -->
<!-- 1.创建实例工厂对象 -->
<bean id="factoryMethodClass" class="com.wangxing.spring.bean.FactoryMethodClass"></bean>
<!-- 2.配置由实例工厂创建Student对象-->
<bean id="stu" factory-bean="factoryMethodClass" factory-method="getStudentObj"></bean>
(4) FactoryBean接口方式实例化bean
//实现FactoryBean接口的子类
package com.wangxing.spring.bean;
import org.springframework.beans.factory.FactoryBean;
public class FactoryBeanSunClass implements FactoryBean<Student> {@Overridepublic Student getObject() throws Exception {return new Student();}@Overridepublic Class<?> getObjectType() {return Student.class;}
}
10. BeanFactory和 FactoryBean 有什么区别?
BeanFactory接口 — Spring容器 — 用来保存和维护Spring创建的对象【管理】
FactoryBean接口-------------------用来创建java对象【创建】
11 . Spring的核心类有哪些,各有什么作用?
BeanFactory接口 | 用来保存和维护Spting创建的对象【Spring容器】 |
---|---|
ApplicationContext接口 | ApplicationContext接口是BeanFactory接口的子接口 |
ClassPathXmlApplicationContext类 | 通过查找classpath[类路径{resources目录}]下的Spring配置文件创建ApplicationContext接口对象/BeanFactory接口对象 |
FileSystemXmlApplicationContext类 | 通过查找系统路径[理解成绝对路径]下的Spring配置文件创建 ApplicationContext接口对象/BeanFactory接口对象。【不推荐使用】 |
FactoryBean接口 | 用来创建java对象【创建】 |
12. 解释Spring支持的几种bean的作用域
singleton: 单例模式【在一个spring容器中,对象只有一个实例。(默认值)】
prototype:多例模式/原型模式【在一个spring容器中,存在多个实例,每次getBean 返回一个新的实例。】
request:该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean,适用于WebApplicationContext环境。【一次请求一个对象】
session:该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。【同一次回话中的对象都是相同的】
global session:该属性仅用于HTTP Session,同session作用域不同的是,所有的Session共享一个Bean实例。【多个session共享一个对象】
利用bean中scope属性
13. 哪些是重要的bean生命周期方法? 能重载它们吗?
Spring工厂对象【Spring容器对象】负责创建对象,初始化对象,销毁对象。
<!-- 无参数构造方法实例化bean的配置 --><!-- id:对象名称 --><!-- class:被创建对象的java类的包名+类名 --><!-- init-method:配置对象的初始化方法 -->
<!-- destroy-method:配置对象的销毁方法 -->
<bean id="student" class="com.click369.javabean.StudentBean" init-method="initStudentBean" destroy-method="destroyStudentBean"></bean>
不能重载,因为xml文件中生命周期属性使用的是生命周期方法名称
14. 什么是Spring的依赖注入?
依赖注入–在调用者类中将被调用者类的对象添加到调用者类中的过程就称为依赖注入。
在这个过程中被调用者类的对象就是调用者类的依赖对象。
15. 有哪些不同类型的DI(依赖注入)方式?
1.基于XML的依赖注入
构造方法注入
<!--constructor-arg构造方法注入元素--><!-- index="0":构造方法参数的索引值--><!-- ref="stu":指定被注入的具体数据值--><constructor-arg index="0" ref="stu"></constructor-arg>
Set方法注入
<!--property:set方法注入需要使用的元素--><!--name="person":调用者类中定义的依赖对象的名称--><!--ref="per":指定被注入的具体数据值--><property name="person" ref="per"></property>
2.自动注入[自动装配策略]
<bean id="personService" class="com.wangxing.spring.byname.PersonService" autowire="byName"></bean>
3.基于注解注入
@Component
@Repository 标注数据访问接口实现类,其功能与 @Component 相同。
@Service标注业务访问接口实现类,其功能与 @Component 相同。
@Controller标注控制层实现类,其功能与 @Component 相同。
@Autowired 完成 Bean 的自动注入工作。默认按照bytype。
@Resource 完成 Bean 的自动注入工作。默认按照byname。
16. Spring的自动装配策略?
byName | 根据 成员变量的 name 自动装配,如果一个 Bean 的 name 和另一个 Bean 中的 Property 的 name 相同,则自动装配这个 Bean 到 Property 中。 |
---|---|
byType | 根据 Property 的数据类型(Type)自动装配,如果一个 Bean 的数据类型兼容另一个 Bean 中 Property 的数据类型,则自动装配。 |
constructor | 根据构造方法的参数的数据类型,进行 byType 模式的自动装配。 |
autodetect | 如果发现默认的构造方法,则用 constructor 模式,否则用 byType 模式。 被标记为过时方法,在Spring3.0之后已经不再支持。 |
no | 默认情况下,不使用自动装配,Bean 依赖必须通过 ref 元素定义。 |
17. Spring注解@Resource和@Autowired区别对比
1、共同点
两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。
2、不同点
(1)@Autowired
@Autowired为Spring提供的注解,只按照byType注入,需要导入包org.springframework.beans.factory.annotation.Autowired;
(2)@Resource
@Resource() | 默认按照ByName自动注入,有两个重要的属性:name和type; |
---|---|
@Resource(“name”) | 按照ByName自动注入 |
@Resource(“type”) | 按照byType自动注入。 |
18. 在 Spring中如何注入一个java集合?
<!-- 创建StudentBean对象,并通过set方式为集合型成员变量赋初始值--><bean id="student" class="com.click369.javabean.StudentBean"><!-- 数组 --><property name="stringArray"><array><value>zhangsan</value><value>lisi</value><value>wangwu</value></array></property><!-- list --><property name="stringList"><list><value>西安</value><value>北京</value><value>上海</value></list></property><!-- set --><property name="stringSet"><set><value>javaSE</value><value>javaEE</value><value>javaME</value></set></property><!-- Map --><!-- key属性的值不能是key --><!-- value属性的值不能是value --><property name="stringMap"><map><entry key="age"><value>23</value></entry><entry key="height" value="167.5"></entry><entry key="sex" value="男"></entry></map></property><!-- properties --><property name="myProperties"><props><prop key="mydirver">com.mysql.jdbc.Driver</prop><prop key="myusername">root</prop><prop key="mypassword">123456</prop></props></property></bean>
</beans>
19. 怎样开启Spring注解装配?
<!-- 开启注解功能 -->
<context:annotation-config/>
<!-- 配置Spring自动扫描包 -->
<context:component-scan base-package="com.click369.javabean"></context:component-scan>
20. IoC 和 DI的区别?
IoC(Inverse of Control 反转控制): 将java对象创建和维护权利交由Spring工厂进行管理和维护。
依赖注入–在调用者类中将被调用者类的对象,添加到调用者类中这个过程就是依赖注入。
在这个过程中被调用者类的对象就是调用者类的依赖对象。
依赖注入是基于IoC(Inverse of Control 反转控制)。
21. Spring面向切面编程(AOP)
AOP (Aspect Oriented Programing) 称为:面向切面编程,是一种编程思想。
AOP 思想: 基于代理思想,对原来目标对象,创建代理对象,在不修改原对象代码情况下,通过代理对象,调用增强功能的代码【系统需求方法】,从而对原有业务方法进行增强。
AOP的底层是动态代理机制【CGLIB动态代理】。
基于两种动态代理机制: JDK动态代理和CGLIB动态代理。
JDK动态代理:基于接口的代理,会生成目标对象的接口的子对象【实现接口的类】
CGLIB动态代理:基于类的代理,会生成目标对象的子对象。【无论是继承父类还是实现接口所产生的类】
基于XML文件的AOP实现
<aop:config><aop:pointcut expression="execution(* com.click369.service.impl.UserServiceImpl.insertService(..))" id="point1"/><aop:pointcut expression="execution(* com.click369.service.impl.UserServiceImpl.updateService(..))" id="point2"/><aop:pointcut expression="execution(* com.click369.service.impl.UserServiceImpl.deleteService(..))" id="point3"/> <aop:aspect ref="myAvice"><aop:before method="savaLog" pointcut-ref="point1"/><aop:after-returning method="savaLog" pointcut-ref="point2"/><aop:around method="around" pointcut-ref="point3"/></aop:aspect></aop:config>
基于注解的Aop实现
@Aspect//@Aspect,表示这个系统需求类是一个切面
@Before("execution(* com.click369.service.impl.UserServiceImpl.insertService(..))")
@AfterReturning("execution(* com.click369.service.impl.UserServiceImpl.updateService(..))")
@Around("execution(* com.click369.service.impl.UserServiceImpl.deleteService(..))")
<!-- 开启aop注解 -->
<aop:aspectj-autoproxy />
22. 在Spring AOP 中,连接点和切入点的区别是什么?
joinpoint(连接点):指那些被拦截到的点。在spring中指的可以被代理(增强)的方法。【业务类中的业务需求方法】
poingcut(切入点):对哪些连接点进行拦截的定义。在Spring中指的真正需要被代理(增强)的方法。
23. Spring支持的事务管理类型
1.编程式事务管理—手动编写大量的java代码实现事务管理
2.声明式事务管理—就是在Spring的配置文件中通过配置实现事务管理
2.1基于xml配置文件
2.2基于注解
24. Spring里面applicationContext.xml文件能不能改成其他文件名?
可以,在web.xml 配置
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:/applicationContext*.xml <!-- spring bean文件所在路径 -->
</param-value>
</context-param>
25. Spring配置文件?
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"><!--扫描属性上面的注解--><!--<context:annotation-config></context:annotation-config>--><!--开启注解扫描--><!--到包里面扫描类型、属性、方法上面的注解--><context:component-scan base-package="com"></context:component-scan><!--开启aop操作--><aop:aspectj-autoproxy></aop:aspectj-autoproxy><!--配置c3p0的连接池--><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="com.mysql.jdbc.Driver"></property><property name="jdbcUrl" value="jdbc:mysql://localhost:3306/customer_service_system"></property><property name="user" value="root"></property><property name="password" value="dadan123"></property></bean><!--配置jdbcTemplate--><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean><!--配置hibernateTemplate事务管理器--><bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"><property name="sessionFactory" ref="sessionFactory"></property></bean><!--事务驱动--><tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven><!--使用spring sessionFactory--><bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"><property name="dataSource" ref="dataSource"></property><property name="configLocations" value="classpath:hibernate.cfg.xml"></property></bean><!--创建hibernateTemplate对象--><bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate"><property name="sessionFactory" ref="sessionFactory"></property></bean>
<!--spring mvc注解驱动-->
<mvc:annotation-driven></mvc:annotation-driven>
最新总结Spring知识及常见面试题相关推荐
- Android开发必须掌握的Java基础知识和常见面试题
Java基础知识 面向对象特征 基本数据类型及装箱拆箱机制 String StringBuffer StringBuild final finally finalize 区别 static关键字 重写 ...
- Spring、SpringBoot常见面试题与答案
Spring Spring Bean 的作用域有哪些?它的注册方式有几种? Spring 容器中管理一个或多个 Bean,这些 Bean 的定义表示为 BeanDefinition 对象,具体包含以下 ...
- Spring IOC的常见面试题
为什么需要IOC? 1.效率方面 传统上创建对象都需要自己new出来,而ioc是将new对象的控制权交给工厂,由工厂来创建,相比于传统的方法,效率提升了很多. 2.管理对象方面 如果对象之间存在很多依 ...
- 前端基础知识与常见面试题(十四)
如果字符串满足以下条件之一,则可以称之为 有效括号字符串(valid parentheses string,可以简写为 VPS): 字符串是一个空字符串 "",或者是一个不为 &q ...
- 测试开发java常见面试题_Java常见面试题200+,学习、面试必备
本套Java面试题,选取了企业面试最常问到的问题,可以做为Java工程师的面试宝典,也可以做为想要不断完善和扩充自己 java 技术的学习者. 主要包含: Java 基础.容器.多线程.反射.对象拷贝 ...
- 搞懂单链表常见面试题
搞懂单链表常见面试题 Hello 继上次的 搞懂基本排序算法,这个一星期,我总结了,我所学习和思考的单链表基础知识和常见面试题,这些题有的来自 <剑指 offer> ,有的来自<程序 ...
- 2021年最新Spring面试题,常见面试题及答案汇总
Spring面试题以及答案整理[最新版]Spring高级面试题大全(2021版),发现网上很多Spring面试题都没有答案,所以花了很长时间搜集,本套Spring面试题大全,汇总了大量经典的Sprin ...
- Spring常见面试题及答案汇总1000道(春招+秋招+社招)
Spring面试题以及答案整理[最新版]Spring高级面试题大全(2021版),发现网上很多Spring面试题都没有答案,所以花了很长时间搜集,本套Spring面试题大全,汇总了大量经典的Sprin ...
- 2020最新Java面试题(java,JavaWeb,数据库,框架),常见面试题及答案汇总
1.面试题模块汇总 面试题包括以下十九个模块:Java 基础.容器.多线程.反射.对象拷贝.Java Web 模块.异常.网络.设计模式.Spring/Spring MVC.Spring Boot/S ...
最新文章
- 申工智能有没有作弊?
- 2017前端开发者必学清单
- Android Studio +MAT 分析内存泄漏实战
- tableview 分组显示返回footerviewt和headerView的高度不能为0的问题
- sql 分组求和_从零学会SQL:汇总分析 D3
- 计算机硬盘满了怎么解决,使用SSD硬盘空间清理 C盘爆满怎么办
- 数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)——Web网络系列学习笔记
- hibernate(nested transactions not supported)异常
- Spring 事务失效的 8 种场景!
- 传授电脑蓝屏开不了机怎么办
- 微信小游戏出台最严健康游戏管理 未成年游戏时间金额受限制
- 平面设计师必备素材|中国/国潮风格
- 【汽车电子】嵌入式软件开发常用工具
- 围棋人机大战一周年:被AlphaGo改变的世界
- C#集成FastReport.Net并将模板保存到数据库
- https证书中比较便宜的证书
- 编译原理实验二 自上而下语法分析
- PHP论坛开发技术总结
- C陷阱与缺陷(C Traps and Pitfalls)读书笔记
- 关于服务器维修的报告模板,维修报告(模板).doc
热门文章
- VC++编写电子邮件程序 第二篇 也是用simple mapi
- Linux命令之read命令
- C++读图txt文件,并将数据结构 图显示出来
- Symantex Endpoint Protection赛门铁克杀毒软件安装
- 家庭和办公路由器被劫持以发动DDoS攻击
- Cisco AnyConnect 报错 connection failed due to unsuccessful domain name resolution
- HTML5期末大作业:服装商城网站设计——2021凡客服装商城(1页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web前端设计与开发期末作品/期末大作业
- win7与ubuntu双系统,启动error:no such partition grub rescue
- 哥特巴赫猜想 尾递归 湘潭孕妇之后的自我检讨
- 如何在服务器上配置深度学习环境