Spring 框架中都用到了哪些设计模式?
如题
3 个回答
为了击碎你伪装的表面,我只能用尽全身力气挥出那惊鸿的半月弧光。风清扬### 1. 控制反转 (IoC) 和依赖注入 (DI) IoC 是 Spring 中一个非常重要的概念,用来实现对象之间的解耦。DI 是实现 IoC 的一种设计模式,通过将依赖注入到对象中来实现控制反转。 ### 2. 工厂设计模式 Spring 使用工厂模式通过 `BeanFactory` 或 `ApplicationContext` 创建 bean 对象。 - **BeanFactory**:延迟注入(懒加载),只有在使用 bean 时才会创建。 - **ApplicationContext**:容器启动时一次性创建所有 bean。 **示例代码:** ```java import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class App { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext( "path/to/bean-factory-config.xml"); HelloApplicationContext obj = (HelloApplicationContext) context.getBean("helloApplicationContext"); obj.getMsg(); } } ``` ### 3. 单例设计模式 Spring 中 bean 的默认作用域是 singleton。单例模式确保一个类只有一个实例,并提供一个全局访问点。 **示例代码:** ```xml <bean id="userService" class="top.snailclimb.UserService" scope="singleton"/> ``` ```java @Scope(value = "singleton") ``` ### 4. 代理设计模式 Spring AOP 基于动态代理。如果被代理对象实现了某个接口,Spring AOP 会使用 JDK 动态代理,否则会使用 Cglib 代理。 ### 5. 模板方法模式 模板方法模式定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。Spring 中的 `JdbcTemplate`、`HibernateTemplate` 等使用了这种模式。 **示例代码:** ```java public abstract class Template { public final void TemplateMethod() { PrimitiveOperation1(); PrimitiveOperation2(); PrimitiveOperation3(); } protected void PrimitiveOperation1() {} protected abstract void PrimitiveOperation2(); protected abstract void PrimitiveOperation3(); } public class TemplateImpl extends Template { @Override public void PrimitiveOperation2() {} @Override public void PrimitiveOperation3() {} } ``` ### 6. 观察者模式 Spring 的事件驱动模型是观察者模式的一个经典应用。 **示例代码:** ```java public class DemoEvent extends ApplicationEvent { private String message; public DemoEvent(Object source, String message) { super(source); this.message = message; } public String getMessage() { return message; } } @Component public class DemoListener implements ApplicationListener<DemoEvent> { @Override public void onApplicationEvent(DemoEvent event) { String msg = event.getMessage(); System.out.println("接收到的信息是:" + msg); } } @Component public class DemoPublisher { @Autowired ApplicationContext applicationContext; public void publish(String message) { applicationContext.publishEvent(new DemoEvent(this, message)); } } ``` ### 7. 适配器模式 Spring AOP 的增强或通知(Advice)使用到了适配器模式。在 Spring MVC 中,`HandlerAdapter` 作为适配器,用于适配不同类型的控制器。 ### 8. 装饰者模式 装饰者模式可以动态地给对象添加一些额外的属性或行为。Spring 中配置 `DataSource` 时可以使用装饰者模式来动态切换不同的数据源。 ## JDK 中使用的设计模式 ### 1. 单例模式 在 JDK 中,`Runtime` 类是单例模式的一个例子。 **示例代码:** ```java Runtime runtime = Runtime.getRuntime(); ``` ### 2. 工厂模式 `Calendar` 类使用了工厂模式来创建实例。 **示例代码:** ```java Calendar calendar = Calendar.getInstance(); ``` ### 3. 代理模式 `java.lang.reflect.Proxy` 类提供了动态代理的功能。 **示例代码:** ```java InvocationHandler handler = new MyInvocationHandler(); MyInterface proxy = (MyInterface) Proxy.newProxyInstance( MyInterface.class.getClassLoader(), new Class<?>[] { MyInterface.class }, handler); ``` ### 4. 观察者模式 `java.util.Observer` 和 `java.util.Observable` 类是观察者模式的实现。 **示例代码:** ```java Observable observable = new MyObservable(); Observer observer = new MyObserver(); observable.addObserver(observer); observable.notifyObservers(); ``` ### 5. 装饰者模式 `java.io` 包中的类,如 `BufferedReader`、`BufferedWriter` 等,是装饰者模式的实现。 **示例代码:** ```java BufferedReader br = new BufferedReader(new FileReader("file.txt")); ``` ### 6. 适配器模式 `java.util.Arrays` 的 `asList` 方法是适配器模式的一个例子。 **示例代码:** ```java List<String> list = Arrays.asList("a", "b", "c"); ``` ### 7. 策略模式 `java.util.Comparator` 接口和 `Collections.sort` 方法是策略模式的实现。 **示例代码:** ```java Collections.sort(list, new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.compareTo(o2); } }); ```发布于 2022-04-29 07:59 •IP属地 青海举报评论收藏1
人一旦不害怕失去,态度就会变得随意,随你意,你随意。叶倾城### Spring 框架中使用的设计模式 在 Spring 框架中,广泛应用了多种设计模式。以下是一些主要的设计模式及其在 Spring 中的应用: 1. **简单工厂模式** - **描述**:根据传入一个唯一的标识来获得 Bean 对象。 - **Spring 中的应用**:Spring 的 `BeanFactory` 就是简单工厂模式的体现。根据传入的参数来创建或获取 Bean 对象。 2. **工厂模式** - **描述**:通过工厂方法来创建对象。 - **Spring 中的应用**:Spring 中的 `FactoryBean` 是典型的工厂方法模式。实现了 `FactoryBean` 接口的 Bean 在使用 `getBean()` 调用时,会自动调用该 Bean 的 `getObject()` 方法,返回的是 `getObject()` 方法的返回值。 3. **单例模式** - **描述**:确保一个类只有一个实例,并提供一个全局访问点。 - **Spring 中的应用**:Spring 中的单例模式通过 `scope="singleton"` 实现。Bean 存放于内部的 Map 中,Bean 名称作为 key,Bean 实例作为 value。 4. **原型模式** - **描述**:通过克隆生成新实例。 - **Spring 中的应用**:Spring 中的原型模式通过 `scope="prototype"` 实现。每次获取的是一个新的实例,修改新实例不会影响原有实例。 5. **迭代器模式** - **描述**:提供一种方法顺序访问聚合对象中的各个元素,而不暴露其内部的表示。 - **Spring 中的应用**:Spring 中的 `CompositeIterator` 实现了 `Iterator` 接口,用于在集合中进行迭代操作。 6. **代理模式** - **描述**:为其他对象提供一种代理以控制对这个对象的访问。 - **Spring 中的应用**:Spring 中经典的 AOP(面向切面编程)就是通过动态代理实现的,分为 JDK 动态代理和 CGLib 动态代理。 7. **适配器模式** - **描述**:将一个接口转换成客户希望的另一个接口,使接口不兼容的类可以一起工作。 - **Spring 中的应用**:Spring 中的 AOP 使用了 `AdvisorAdapter`,例如 `MethodBeforeAdviceAdapter`、`AfterReturningAdviceAdapter`、`ThrowsAdviceAdapter` 等。Spring 还有很多以 Adapter 结尾的类,大多都是适配器模式的应用。 8. **观察者模式** - **描述**:定义对象间的一对多依赖关系,当一个对象状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。 - **Spring 中的应用**:Spring 的事件机制。`ApplicationEvent` 和 `ApplicationListener` 是典型的观察者模式应用。 9. **模板模式** - **描述**:定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。 - **Spring 中的应用**:Spring 的 `JdbcTemplate` 是模板模式的经典应用,通过 `execute` 方法定义了算法步骤。 10. **责任链模式** - **描述**:为请求创建一条接收者对象的链,这些对象按顺序处理请求,直到其中某个对象能够处理该请求为止。 - **Spring 中的应用**:Spring MVC 中的 `DispatcherServlet` 的 `doDispatch()` 方法,通过 `HandlerExecutionChain` 处理请求。 ### 总结 Spring 框架中使用了多种设计模式来解决不同的问题,提升框架的灵活性和可维护性。常见的设计模式包括: 1. 简单工厂模式(`BeanFactory`) 2. 工厂模式(`FactoryBean`) 3. 单例模式(`scope="singleton"`) 4. 原型模式(`scope="prototype"`) 5. 迭代器模式(`CompositeIterator`) 6. 代理模式(AOP 动态代理) 7. 适配器模式(`AdvisorAdapter` 等) 8. 观察者模式(事件和监听器) 9. 模板模式(`JdbcTemplate`) 10. 责任链模式(`HandlerExecutionChain`) 这些设计模式的应用,使得 Spring 框架能够提供强大的功能,同时保持高内聚和低耦合的设计。发布于 2022-02-01 09:02 •IP属地 浙江举报评论收藏
谎言不会伤人,真相才是快刀。华仔(1)工厂模式:BeanFactory 就是简单工厂模式的体现,用来创建对象的实例; (2)单例模式:Bean 默认为单例模式。 (3)代理模式:Spring 的 AOP 功能用到了 JDK 的动态代理和 CGLIB 字节码生成技术; (4)模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。 (5)观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如 Spring 中 listener 的实现–ApplicationListener。编辑于 2021-04-04 10:16 •IP属地 浙江举报评论收藏
公众号进入网站体验更佳

