设计模式--spring中用到的设计模式

一、单例模式(Singleton Pattern)

  • 定义:确保一个类只有一个实例,并提供全局访问点

  • Spring中的应用:Spring默认将Bean配置为单例模式

  • 案例:

复制代码
@Component
public class MySingletonBean {
    // Spring 默认将其管理为单例
}
  • 在spring容器中,MySingletonBean只会有一个实例

二、工厂模式(Factory Pattern)

  • 定义:定义一个创建对象的接口,由子类决定实例化哪个类

  • spring中的应用:BeanFactory和ApplicationContext是工厂模式的实现

  • 案例:

复制代码
@Configuration
public class AppConfig {
    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}
  • AppConfig是一个工厂类,myBean()方法负责创建MyBean实例

三、原型模式(Prototype Pattern)

  • 定义:通过复制现有对象来创建新对象

  • Spring中的应用:通过@Scope("prototype")配置Bean为原型模式

  • 案例

复制代码
@Component
@Scope("prototype")
public class MyPrototypeBean {
    // 每次获取时都会创建一个新实例
}

四、模板方法模式(Template Method Pattern)

  • 定义:定义一个算法的骨架,将某些步骤延迟到子类中实现

  • Spring中的应用:JdbcTemplate、RestTemplate等

  • 案例:

复制代码
@Autowired
private JdbcTemplate jdbcTemplate;
​
public void queryData() {
    String sql = "SELECT * FROM users";
    jdbcTemplate.query(sql, (rs, rowNum) -> {
        System.out.println(rs.getString("username"));
        return null;
    });
}

五、适配器模式(Adapter Pattern)

  • 定义:将一个类的接口转换成客户端期望的另一个接口

  • spring中的应用:Spring MVC中的HandlerAdapter

  • 案例:

复制代码
@Controller
public class MyController {
    @RequestMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }
}

六、装饰者模式(Decorator Pattern)

  • 定义:动态地为对象添加额外的职责

  • spring中的应用:spring AOP中的代理

  • 案例:

复制代码
@Aspect
@Component
public class LoggingAspect {
    @Before("execution(* com.example.service.*.*(..))")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("Before method: " + joinPoint.getSignature().getName());
    }
}
  • AOP通过装饰者模式为方法添加日志功能

七、观察者模式(Observer Pattern)

  • 定义:定义对象间的一对多依赖关系,当一个对象状态改变时,所有依赖对象都会收到通知

  • spring容器中的应用:Spring的事件机制

  • 案例:

复制代码
@Component
public class MyEventListener implements ApplicationListener<MyEvent> {
    @Override
    public void onApplicationEvent(MyEvent event) {
        System.out.println("Event received: " + event.getMessage());
    }
}
​
@Component
public class MyEventPublisher {
    @Autowired
    private ApplicationEventPublisher publisher;
​
    public void publishEvent(String message) {
        publisher.publishEvent(new MyEvent(this, message));
    }
}
  • MyEventPublisher发布事件,MyEventListener监听并处理

八、代理模式(Proxy Pattern)

  • 定义:为其他对象提供一个代理以控制对这个对象的访问

  • Spring中的应用:SpringAOP和动态代理

  • 案例:

复制代码
@Service
public class MyService {
    public void doSomething() {
        System.out.println("Doing something...");
    }
}
​
@Aspect
@Component
public class MyAspect {
    @Around("execution(* com.example.service.MyService.*(..))")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("Before method");
        Object result = joinPoint.proceed();
        System.out.println("After method");
        return result;
    }
}
  • AOP通过代理模式为MyService的方法添加额外逻辑

九、组合模式(Composite Pattern)

  • 定义:将对象组合成树形结构以表示"部分-整体"的层次结构

  • spring中的应用:Spring Security的过滤器链

  • 案例:

复制代码
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/public/**").permitAll()
            .antMatchers("/private/**").authenticated();
    }
}
  • Spring Security将多个过滤器组合成一个过滤器链

十、策略模式(Strategy Pattern)

  • 定义:定义一系列算法,将它们封装起来,并使它们可以互相替换

  • Spring中的应用:Spring的资源加载策略(ResourceLoader)

  • 案例:

复制代码
@Autowired
private ResourceLoader resourceLoader;
​
public void loadResource() {
    Resource resource = resourceLoader.getResource("classpath:data.txt");
    System.out.println("Resource loaded: " + resource.exists());
}
  • ResourceLoader根据不同的资源加载策略加载资源(如文件系统、类路径等)。
相关推荐
快乐非自愿6 分钟前
Spring Boot集成Spring Security之HTTP请求授权
spring boot·spring·http
瑞金彭于晏9 分钟前
通俗易懂版 Maven 科普,maven是什么?
java·maven
好看资源平台13 分钟前
Java Web开发实战与项目——Spring Boot与Spring Cloud微服务项目实战
java
.猫的树19 分钟前
Java集合List快速实现重复判断的10种方法深度解析
java·开发语言·list·集合
littlegirll28 分钟前
命令行方式安装KFS同步KES到KADB
java·大数据·数据库
itachi-uchiha35 分钟前
深入理解 Linux 中的 last 和 lastb 命令
java·linux·服务器
xiaoyustudiowww42 分钟前
JSP + Servlet 实现 AJAX(纯JS版)
java·javascript·servlet
计算机毕设定制辅导-无忧学长43 分钟前
Maven 插件的使用(一)
java·python·maven
一只_程序媛1 小时前
【leetcode hot 100 42】接雨水
java·算法·leetcode
代码小白%1 小时前
快速理解Spring 和 Spring Boot 的核心区别
java·spring boot·spring