Java面试之Spring/Spring MVC

平时用过哪些Spring的注解
spring 有哪些主要模块?

https://www.w3cschool.cn/wkspring/dcu91icn.html

IOC(控制反转)和 DI (依赖注入)

https://www.w3cschool.cn/wkspring/f8pc1hae.html

AOP(面向切面)

https://www.w3cschool.cn/wkspring/izae1h9w.html

平时在哪里用过AOP,怎么用的?

声明式事务管理比编程式事务管理更可取,尽管它不如编程式事务管理灵活,但它允许你通过代码控制事务。但作为一种横切关注点,声明式事务管理可以使用 AOP 方法进行模块化。Spring 支持使用 Spring AOP 框架的声明式事务管理。
https://www.w3cschool.cn/wkspring/jcny1mmg.html

Spring MVC 有哪些组件?

https://www.cnblogs.com/gxc6/p/9544563.html

Spring MVC 运行流程?

https://www.cnblogs.com/gxc6/p/9544563.html

spring 常用的注入方式有哪些?
  • setter方法注入
  • 类构造函数注入
  • 接口注入
spring 中的 bean 是线程安全的吗?

spring 中的 bean 默认是单例模式,spring 框架并没有对单例 bean 进行多线程的封装处理。

实际上大部分时候 spring bean 无状态的(比如 dao 类),所有某种程度上来说 bean 也是安全的,但如果 bean 有状态的话(比如 view model 对象),那就要开发者自己去保证线程安全了,最简单的就是改变 bean 的作用域,把“singleton”变更为“prototype”,这样请求 bean 相当于 new Bean()了,所以就可以保证线程安全了。

  • 有状态就是有数据存储功能。
  • 无状态就是不会保存数据。
spring 支持几种 bean 的作用域?

spring 支持 5 种作用域,如下:

  • singleton:spring ioc 容器中只存在一个 bean 实例,bean 以单例模式存在,是系统默认值;
  • prototype:每次从容器调用 bean 时都会创建一个新的示例,既每次 getBean()相当于执行 new Bean()操作;
    Web 环境下的作用域:
  • request:每次 http 请求都会创建一个 bean;
  • session:同一个 http session 共享一个 bean 实例;
  • global-session:用于 portlet 容器,因为每个 portlet 有单独的 session,globalsession 提供一个全局性的 http session。
    注意: 使用 prototype 作用域需要慎重的思考,因为频繁创建和销毁 bean 会带来很大的性能开销。
spring 自动装配 bean 的方式有哪些?
  • 1、 No: 即不启用自动装配。

  • 2、 byName: 通过属性的名字的方式查找 JavaBean 依赖的对象并为其注入。比如说类 Computer 有个属性 printer,指定其 autowire 属性为 byName 后,Spring IoC 容器会在配置文 件中查找 id/name 属性为 printer 的 bean,然后使用 Seter 方法为其注入。

  • 3、 byType: 通过属性的类型查找 JavaBean 依赖的对象并为其注入。比如类 Computer 有个属性 printer,类型为 Printer,那么,指定其 autowire 属性为 byType 后,Spring IoC 容 器会查找 Class 属性为 Printer 的 bean,使用 Seter 方法为其注入。

  • 4、 constructor: 通 byType 一样,也是通过类型查找依赖对象。与 byType 的区别在于 它不是使用 Seter 方法注入,而是使用构造子注入。

  • 5、 autodetect: 在 byType 和 constructor 之间自动的选择注入方式。

  • 6、 default:由上级标签的 default-autowire 属性确定。

spring 事务实现方式有哪些?
  • 1、编程式事务,在代码中硬编码。(不推荐使用)

  • 2、声明式事务,在配置文件中配置(推荐使用) 声明式事务又分为两种:
    a、基于 XML 的声明式事务
    b、基于注解的声明式事务

说一下 spring 的事务隔离?

spring 有五大隔离级别,默认值为

  • ISOLATION_DEFAULT(使用数据库的设置),其他四个隔离级别和数据库的隔离级别一致:

  • ISOLATIONREADUNCOMMITTED:未提交读,最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读);

  • ISOLATIONREADCOMMITTED:提交读,一个事务提交后才能被其他事务读取到(会造成幻读、不可重复读),SQL server 的默认级别;

  • ISOLATIONREPEATABLEREAD:可重复读,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读),MySQL 的默认级别;

  • ISOLATION_SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。

spring 有两种代理方式:
  • 1、若目标对象实现了若干接口,spring 使用 JDK 的 java.lang.reflect.Proxy 类代理。

优点:因为有接口,所以使系统更加松耦合

缺点:为每一个目标类创建接口

  • 2、若目标对象没有实现任何接口,spring 使用 CGLIB 库生成目标对象的子类。

优点:因为代理类与目标类是继承关系,所以不需要有接口的存在。

缺点:因为没有使用接口,所以系统的耦合性没有使用 JDK 的动态代理好。

spring 中的核心类有那些,各有什么作用?
  • BeanWrapper: 提供统一的 get 及 set 方法
  • BeanFactory: 产生一个新的实例,可以实现单例模式
  • ApplicationContext: 提供框架的实现,包括 BeanFactory 的所有功能
Bean 的调用方式有哪些?

有三种方式可以得到 Bean 并进行调用:

  • 1、使用 BeanWrapper
HelloWorld hw = new HelloWorld(); 
BeanWrapper bw = new BeanWrapperImpl(hw);
bw.setPropertyvalue("msg","HelloWorld");
System.out.println(bw.getPropertyCalue("msg"));
  • 2、使用 BeanFactory
InputStream is = new FileInputStream("config.xml");   
XmlBeanFactory factory = new XmlBeanFactory(is); 
HelloWorld hw = (HelloWorld)factory.getBean("HelloWorld");  
System.out.println(hw.getMsg());   
  • 3、使用 ApplicationConttext
ApplicationContext actx = new FleSystemXmlApplicationContext("config.xml");   
HelloWorld hw = (HelloWorld)actx.getBean("HelloWorld");      
System.out.println(hw.getMsg());  
如果⼀个接口有2个不同的实现, 那么怎么来Autowire⼀个指定的实现?

@Autowired 配合 @Qualifier(“类别名”)一起使用

参考:https://blog.csdn.net/showchi/article/details/97012156

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值