Spring 框架中用到了哪些设计模式?请举例说明。

回答·43
最热
最新
  • 无非是考察设计模式的应用,以下所有设计模式在源码中应用,请查收。 工厂方法模式:AbstractBeanFactory 。 抽象工厂模式:在 Spring 中,BeanFactory 单例模式:Spring中创建单例。 建造者模式:解析xml文件 原型模式:在创建ioc容器后,通过getBean()获取bean对象时,往里追可以发现在核心方法处spring对bean的scope属性进行了判断,配置了prototype时。 适配器模式:spring AOP中的MethodBeforeAdviceAdapter类。 装饰模式:TransactionAwareCacheDecorator 类 代理模式:spring中代理有两种,Jdk代理方式和CGLIB。 外观模式:Tomcat 中,catalina.jar 中的 RequestFacade 和 ResponseFacade 。 桥接模式:JDBC  组合模式:CompositeCacheManager,Mybatis 在处理 xml 动态 sql 中用到了。 享元模式:String常量池, Integer 的静态内部类 IntegerCache。 策略模式:Cglib2AopProxy和JdkDynamicAopProxy分别代表两种策略的实现方式。 模板方法模式:JdbcTemplate实现了一系列常用的数据访问的算法骨架。 观察者模式: ApplicationListener, ContextLoaderListener等。 迭代器模式:集合。 责任链模式:handler,filter,Intercept。 命令模式:Tomcat 中命令模式在 Connector 和 Container 组件之间有体现。 备忘录模式:spring-webflow 中的stateManageableMessageContext.createMessageMemento() 状态模式:spring-statemachine spring状态机 访问者模式:Spring 中的 BeanDefinitionVisitor 类主要用于访问 BeanDefinition。 中介者模式:Java web 开发中 MVC 模式(Model-View-Controller)就用到了中介者模式,Controller 就是 Model 和 View 的中介 解释器模式:在 Spring 中,ExpressionParser 接口内部采用的是解释器模式。
  • 工厂模式   - 应用场景:BeanFactory和ApplicationContext作为IoC容器,通过工厂模式创建Bean实例。   - 示例: BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml")); ,通过工厂获取Bean对象。   单例模式   - 应用场景:Spring容器中的Bean默认都是单例模式,确保一个容器内只有一个Bean实例。   - 示例:在配置文件中 scope="singleton" (默认),如 @Service 注解的类默认是单例。   代理模式   - 应用场景:AOP(面向切面编程)的实现基于代理模式,包括JDK动态代理和CGLIB代理。   - 示例:通过 @Transactional 注解实现事务管理时,Spring会生成代理对象来织入事务逻辑。   模板方法模式   - 应用场景:Spring的JdbcTemplate、HibernateTemplate等模板类,定义了通用操作流程。   - 示例: JdbcTemplate 中 query() 方法定义了查询的基本流程,子类可重写具体处理逻辑。   观察者模式   - 应用场景:Spring的事件驱动模型,如 ApplicationEvent 和 ApplicationListener 。   - 示例:自定义事件监听时,当发布 ApplicationEvent 事件,监听该事件的Bean会被触发。   策略模式   - 应用场景:Spring的事务管理中,不同的事务策略(如PROPAGATION_REQUIRED)对应不同处理逻辑。   - 示例: PlatformTransactionManager 接口的实现类(如 DataSourceTransactionManager )提供不同事务处理策略。   适配器模式   - 应用场景:Spring MVC中 HandlerAdapter 接口适配不同的处理器(Handler)。   - 示例: DispatcherServlet 通过 HandlerAdapter 适配不同类型的Controller(如注解控制器、XML配置控制器)。
  • 这个可以当八股文的题目。 1. 单例模式,  Bean的创建有使用单例模式,但是与经典JAVA单例实现有区别。 2. 工厂模式,BeanFactory,ApplicationContext 3. 代理模式,AOP则使用代理模式。 4. 观察者模式,监听器的实现使用了观察者
  • 工厂 bean  单例 作用域 代理 aop 观察者  listener
  • 单例设计模式:spring容器的bean默认就是单例模式 模版方法设计模式 动态代理 适配器 原型模式 工程设计模式 beanfactory 装饰模式 等等
  • 策略链: 比如springmvc中的过滤器Filter 单例模式: 比如springboot中有个一级缓存容器singleObjects就是存放单例bean的 简单工厂: 比如spring中的beanfactory就是根据类名和beanDefinition里面的属性创建的 观察者模式(发布订阅): 比如springboot提供了的applicationListener接口就是观察者模式,或者叫做发布订阅 原型模式: 比如创建bean的时候就有prototype原型模式,每次请求都会创建bean. 模板模式: 比如spring-data-redis里面就有stringTemplate创建模板,可以选择访问redis的数据结构 ……
  • 过滤器,拦截器,责任链模式 jdbc 桥接模式 事务  代理模式 aop增强  适配器模式 事件驱动   观察者模式 resourse 资源文件处理   策略模式
  • 工厂模式 抽象工厂模式 模板模式策略模式 观察者模式 建造者模式 代理模式 装饰模式 适配器模式 亨元模式
  • Spring框架中使用了多种设计模式,其中一些常见的设计模式包括: 1. **单例模式(Singleton):** Spring中的Bean默认为单例模式,保证一个类只有一个实例。例如,ApplicationContext本身就是一个单例,整个应用程序只有一个ApplicationContext实例。 2. **工厂模式(Factory):** Spring使用工厂模式创建Bean实例,通过ApplicationContext容器来获取Bean实例。例如,通过`context.getBean("beanName")`来获取Bean实例。 3. **代理模式(Proxy):** Spring AOP(面向切面编程)基于代理模式,使用动态代理技术来实现横切关注点的功能,如事务管理和日志记录。例如,Spring中的事务管理就是通过代理模式来实现的。 4. **模板模式(Template):** Spring提供了JdbcTemplate等模板类来简化数据库操作,模板模式将公共部分的代码封装在抽象类中,具体实现由子类来完成。 5. **观察者模式(Observer):** Spring中的事件监听机制基于观察者模式,可以通过ApplicationEvent和ApplicationListener来实现事件的发布和监听。 6. **装饰器模式(Decorator):** Spring中的Bean后置处理器(BeanPostProcessor)机制使用了装饰器模式,可以在Bean实例化和初始化的过程中添加自定义的处理逻辑。 7. **适配器模式(Adapter):** Spring中的HandlerAdapter和HandlerInterceptor就是适配器模式的应用,将不同的Controller处理器适配到统一的处理流程中。 8. **策略模式(Strategy):** Spring中的AOP使用了策略模式,通过Advice实现不同的横切关注点,如BeforeAdvice、AfterAdvice等。 这些设计模式的应用使得Spring框架更加灵活、可扩展、易于维护,同时也符合了面向对象编程的设计原则,如单一职责、开闭原则等。
  • 1.工厂: 创建bean对象过程 2.单例:spring中的bean默认都是单例的 3.代理: spring aop的实现 4.适配器:将不同定义的controller类中的函数,适配为统一的函数定义 5.观察者:监听器的实现 6.装饰器:含有Wrapper和Decorator的类,动态给一个对象添加一些额外的职责 7.模板: JdbcTemplate