一、Spring框架中bean的理解
1.1、Spring中bean的作用域有哪些?
- singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的;
- prototype : 每次请求都会创建一个新的 bean 实例;
- request : 每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP request内有效;
- session : 每一次HTTP请求都会产生一个新的 bean,该bean仅在当前 HTTP session 内有效;
1.2、@Component和@Bean的区别
(1)作用对象不同:@Component注解作用域类@Bean注解作用于方法
(2)作用方法不同:@Component注解通过类路径扫描来自动侦测以及自动装配到Spring中;@Bean
注解通常在标有该注解的方法中定义产生这个bean,@Bean
告诉了Spring这是某个类的示例,当需要它时再给我
(3)@Bean
注解比@ Component
注解的自定义性更强:当引入第三方库中的类需要装配到Spring时只能用@Bean
注意:@ComponentScan
注解定义要扫描的路径从中找出标识了需要装配的类自动装配到 Spring 的 bean 容器中
//比如在SpringBoot启动类中,这样使用将扫描范围扩大到整个父包
@ComponentScan(“com.xxx.xx.springboot”)
@SpringBootApplication
public class SpringbootIn10StepsApplication {
...
}
1.3、将一个类声明为Spring的bean的注解有哪些?
一般使用@Autowired
注解自动装配bean,想要把类标识成可用于@Autowired
注解自动装配的bean的类,采用以下注解可实现:
@Component
:通用的注解,可标注任意类为Spring
组件。如果一个Bean不知道属于哪个层,可以使用@Component
注解标注。@Repository
: 对应持久层即 Dao 层,主要用于数据库相关操作。@Service
: 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao层。@Controller
: 对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。
1.4、Spring中bean的生命周期
推荐阅读:https://www.cnblogs.com/zrtqsk/p/3735273.html
二、Spring框架中使用了哪些设计模式
推荐阅读:连接
-
工厂设计模式 : Spring使用工厂模式通过
BeanFactory
、ApplicationContext
创建 bean 对象。 -
代理设计模式 : Spring AOP 功能的实现。
-
单例设计模式 : Spring 中的 Bean 默认都是单例的。
扫描二维码关注公众号,回复: 8846549 查看本文章 -
模板方法模式 : Spring 中
jdbcTemplate
、hibernateTemplate
等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。 -
包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
-
观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
-
适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配
Controller
。
2.1、Spring中的工厂模式
Spring中使用工厂模式可以通过 BeanFactory
或 ApplicationContext
创建 bean 对象
(1)两者对比:
BeanFactory
:延迟注入(使用到某个bean时才会注入),比BeanFactory占用内存少、启动速度快;
ApplicationContext
:容器启动时注入,不管用没用到,一次性创建所有bean,功能比BeanFactory
多,常用。
(2)ApplicationContext的三个实现类:
-
ClassPathXmlApplication
:把上下文文件当成类路径资源。 -
FileSystemXmlApplication
:从文件系统中的 XML 文件载入上下文定义信息。 -
XmlWebApplicationContext
:从Web系统中的XML文件载入上下文定义信息。
2.2、Spring中的单例模式
在系统中有些对象只需要一个,比如:线程池、缓存、注册表、日志对象等。
Spring中bean的默认作用域singleton就是单例的。
Spring中单例的实现方式(2种):
-
xml:<bean id="userService" class="top.snailclimb.UserService" scope="singleton"/>
-
注解:
@Scope(value = "singleton")
实现原理:
Spring中通过ConcurrentHashMap
实现单例注册表的方式,实现单例模式,核心代码如下:
// 通过 ConcurrentHashMap(线程安全) 实现单例注册表
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(64);
public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
Assert.notNull(beanName, "'beanName' must not be null");
synchronized (this.singletonObjects) {
// 检查缓存中是否存在实例
Object singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null) {
//...省略了很多代码
try {
singletonObject = singletonFactory.getObject();
}
//...省略了很多代码
// 如果实例对象在不存在,我们注册到单例注册表中。
addSingleton(beanName, singletonObject);
}
return (singletonObject != NULL_OBJECT ? singletonObject : null);
}
}
//将对象添加到单例注册表
protected void addSingleton(String beanName, Object singletonObject) {
synchronized (this.singletonObjects) {
this.singletonObjects.put(beanName, (singletonObject != null ? singletonObject : NULL_OBJECT));
}
}
}
2.3、Spring中的代理模式
SpringAOP能将那些与业务无关,缺为业务模块共同调用的逻辑(事物处理、日志管理、权限控制)封装起来,为了减少代码、降低耦合、高扩展、可维护。AOP就是基于动态代理的。
2.4、Spring中的模板方法模式
模板方法定义了一个操作中的算法骨架,将一些步骤延迟到子类中,使得子类可以不改变一个算法结构即可重定义该算法某些特定步骤的实现方法。
Spring中的jdbctemplate、hibernateTemplate
等以Template 结尾的对数据库操作的类,就是用了模板方法模式。
2.5、Spring中的观察者模式(发布-订阅)
表示对象与对象之间的依赖关系,当一个对象发生改变时这个对象所依赖的对象也会做出反应。
Spring中的事件驱动模型 就是观察者模式的经典应用
Spring中的时间流程:
(1)定义一个事件
(2)定义一个事件监听者
(3)使用事件发布者发布消息
2.6、Spring中的适配器模式
适配器模式(Adapter)就是将一个接口转换为客户希望的另一个接口,适配器使接口不兼容的那些类一起工作
(1)SpringAOP中的适配器模式
都知道AOP的实现是基于代理模式,但是AOP里边的增强或者通知(Advice)使用了适配器模式
(2)SpringMVC中的适配器模式
在Spring MVC中,DispatcherServlet
根据请求信息调用 HandlerMapping,
解析请求对应的 Handler。解析到对应的
Handler后,开始由HandlerAdapter适配器处理
为什么要在 Spring MVC 中使用适配器模式?
SpringMVC中Controller种类众多,不同类的Controller通过不同的方法来请求进行处理,如果不利用适配器模式的话,DispatcherServlet
直接获取对应类型的Controller,需要自己来判断。
2.7、Spring中的装饰者模式
可以动态地给对象添加一些额为的属性或者行为,比继承更加灵活。当我们需要修改原有功能又不愿意修改原有代码时,设计一个Decorator套在原有代码外面。
JDK中的各种流就用到了(InputStream、FileInputStream
、BufferedInputStream
)
Spring中配置DataSource 时,DataSource 可能是不同的数据库和数据源,使用装饰者模式可以根据客户需求在少修改原有代码下动态切换数据源,Spring中带Wrapper或者Decorator结尾的基本都是动态给一个对象添加额外的职责。
三、Spring事物
3.1、Spring中管理事物的几种方式
(1)编程式事物:在代码中硬编码(不推荐使用);
(2)声明式事物:在配置文件中配置(推荐使用)——分为两种
- 基于XML的声明式事物;
- 基于注解的声明式事物。
3.2、Spring中事物的隔离级别
TransactionDefinition 接口定义了5个表示隔离级别的常量
(1)TransactionDefinition.ISOLATION_DEFAULT(使用数据库默认隔离级别)
Mysql 默认采用的 REPEATABLE_READ隔离级别 ;Oracle 默认采用的 READ_COMMITTED隔离级别
(2)TransactionDefinition.ISOLATION_READ_UNCOMMITTED(最低隔离级别)——读取未提交
允许读取尚未提交数据,可能会导致脏读、幻读、不可重复读
(3)TransactionDefinition.ISOLATION_READ_COMMITTED——Oracle默认——读取已提交
允许读取并发事物已提交的数据,可阻止脏读,但幻读和不可重复读仍可发生。
(4)TransactionDefinition.ISOLATION_REPEATABLE_READ——MySQL默认——可重复读
对同一字段多次读取结果一致(除非被本身事物修改),可以阻止脏读和不可重复读,幻读仍可发生
(5)TransactionDefinition.ISOLATION_SERIALIZABLE(最高隔离级别)——可串行化
完全服从ACID的隔离级别,所有事物依次执行,可防止脏读、不可重复读、幻读。但是性能不好不常用
注:MySQL和Oracle的默认隔离级别是不一样的
上一篇:Spring Ioc控制反转
下一篇:Spring MVC全面了解
参考资料:《Spring技术内幕》