Spring 的通知是什么?有哪几种类型?通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过 SpringAOP 框架触发的代码段 。Spring 切面可以应用五种类型的通知:
- before:前置通知,在一个方法执行前被调用 。
- after: 在方法执行之后调用的通知,无论方法执行是否成功 。
- after-returning: 仅当方法成功完成后执行的通知 。
- after-throwing: 在方法抛出异常退出时执行的通知 。
- around: 在方法执行之前和之后调用的通知 。
优点:IOC 或 依赖注入把应用的代码量降到最低 。它使应用容易测试,单元测试不再需要单例和 JNDI 查找机制 。最小的代价和最小的侵入性使松散耦合得以实现 。IOC 容器支持加载服务时的饿汉式初始化和懒加载 。
BeanFactory 与 AppliacationContext 有什么区别?BeanFactory基础类型的 IOC 容器,提供完成的 IOC 服务支持 。如果没有特殊指定,默认采用延迟初始化策略 。相对来说,容器启动初期速度较快,所需资源有限 。
ApplicationContextApplicationContext 是在 BeanFactory 的基础上构建,是相对比较高级的容器实现,除了 BeanFactory 的所有支持外,ApplicationContext 还提供了事件发布、国际化支持等功能 。ApplicationContext 管理的对象,在容器启动后默认全部初始化并且绑定完成 。
Spring 支持的几种 bean 的作用域?Spring 框架支持以下五种 bean 的作用域:singleton : bean 在每个 Spring ioc 容器中只有一个实例 。prototype:一个 bean 的定义可以有多个实例 。request:每次 http 请求都会创建一个 bean,该作用域仅在基于 web 的 Spring ApplicationContext 情形下有效 。session : 在一个HTTP Session中 ,一个bean定义对应一个实例 。该作用域仅在基于web 的Spring ApplicationContext 情形下有效 。global-session:在一个全局的 HTTP Session 中,一个 bean 定义对应一个实例 。该作用域仅在基于 web 的Spring ApplicationContext 情形下有效 。
缺省的 Spring bean 的作用域是 Singleton 。Spring 框架中的单例 bean 是线程安全的吗?不是线程安全的 。当存在共享变量时,大家都能去调用,此时就存在线程安全问题 。
什么是 bean 的自动装配?有哪些方式自动装配?自动装配:无须在 Spring 配置文件中描述 javaBean 之间的依赖关系(如配置<property>、<constructor-arg>) 。IOC 容器会自动建立 javabean 之间的关联关系 。
五种自动装配的方式:
- no:默认的方式是不进行自动装配,通过显式设置 ref 属性来进行装配 。
- byName:通过参数名自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成 byname,
- byType:通过参数类型自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成 byType,
- constructor:这个方式类似于 byType,但是要提供给构造器参数,如果没有确定的带参数的构造器参数类
- autodetect:首先尝试使用 constructor 来自动装配,如果无法工作,则使用 byType 方式 。
AOP 技术利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面 。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性 。使用"横切"技术,AOP 把软件系统分为两个部分:核心关注点和横切关注点 。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点 。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物 。AOP 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来 。AOP 核心就是切面,它将多个类的通用行为封装成可重用的模块,该模块含有一组 API 提供横切功能 。比如,一个日志模块可以被称作日志的 AOP 切面 。根据需求的不同,一个应用程序可以有若干切面 。在 Spring AOP 中,切面通过带有@Aspect 注解的类实现 。
推荐阅读
- 什么是Java可变参数列表?怎么和重载机制配合使用?
- Java安全编码之sql注入
- 异步文件通道Java NIO你需要了解多少,来看看这篇文章
- Java开源框架之SpringMVC原理及源码解析
- 破解 Java Agent 探针黑科技
- 内含95个工具函数 前端大佬都在使用的JavaScript工具函数宝典
- go语言137道面试题整理汇总
- Java分布式项目,你使用的哪种注册中心?为啥?
- Java中的“协程”
- JAVA并发-ScheduledExecutorService