Spring中的设计模式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言


一、工厂模式

这段文字主要阐述了 Spring 框架的核心设计理念,重点解释了什么是 BOP 以及 IOC 的具体实现方式。以下是详细解读:

  1. Spring 的设计理念:BOP (Bean Oriented Programming)

核心主角 :文中强调 Spring 是面向 Bean 的编程。在 Spring 中,一切都是围绕 "Bean" 展开的。

类比理解:就像在面向对象编程(OOP)中 "Object(对象)" 是基础一样,在 Spring 中 "Bean" 就是基础。没有对象就没有 OOP,同样,没有 Bean 也就没有 Spring。

管理方式 :Spring 提供了 IoC 容器,通过配置文件或注解来管理这些 Bean 之间的依赖关系。

  1. 控制反转 (IoC) 及其实现方式

定义 :IoC (Inversion of Control) 是一种设计原则,目的是降低代码的耦合度

具体操作:对象在被创建时,其依赖关系不再由对象自己控制,而是交给一个"外界实体"(即 IoC 容器)来统一管理。

文中提到了 IoC 最常见的两种实现方式:

方式一:依赖注入 (DI - Dependency Injection)

含义:容器在运行期,动态地将某种依赖关系注入到对象中。

特点:被动接收。对象只需要定义好需要什么(如通过 @Autowired),容器就会自动给它,不需要对象自己去 new。

优点:代码解耦,易于测试和维护。

方式二:依赖查找 (Dependency Lookup)

含义:容器提供接口,对象主动去容器中查找并获取自己需要的依赖。

特点:主动查找。对象需要自己去容器里"拿"需要的资源。

总结

这段话的核心逻辑是:Spring 是管理 Bean 的容器,它通过 IoC 机制(主要是 DI 和少量的 DL)来控制对象的创建和依赖关系,从而让开发者从繁琐的对象管理中解放出来,专注于业务逻辑。

依赖

java 复制代码
// 业务层:UserService
public class UserService {
    // 它需要调用UserDao来存取数据
    private UserDao userDao; // ← UserDao 就是 UserService 的依赖
    
    public void saveUser(User user) {
        userDao.save(user); // 没有UserDao,这个方法就报错
    }
}

如果没有IOC:违反"单一职责原则"

java 复制代码
public class UserService {
    // 痛点1:直接new,耦合死
    private UserDao userDao = new UserDaoImpl(); 
    
    // 痛点2:如果要换实现(如换为MockDao),必须改代码
    // private UserDao userDao = new MockUserDaoImpl();
}

如果有IOC:接口会自动去找实现类,更改UserDaoImpl实现类可以不更改UserService的代码,不违反"单一职责原则"。

java 复制代码
@Component
public class UserService {
    // 只声明"我需要什么",不关心"怎么来"
    @Autowired
    private UserDao userDao; // ← 依赖由Spring注入
    userDao.test1();
}

IOC

1.依赖注入

java 复制代码
@Component
public class UserService {
    // 只声明"我需要什么",不关心"怎么来"
    @Autowired
    private UserDao userDao; // ← 依赖由Spring注入
}

2.依赖查找

java 复制代码
// 主动向容器"要"依赖(较少使用)
UserDao userDao = applicationContext.getBean("userDao");

BeanFactory

是所有Bean的父类;他有三个子类ListenableBeanfactory、HierarchicalBeanfactory、AutoweirableCapableBeanfactory。我们使用的是defaultlistenableBeanfactory

里面的方法主要就是getbean和bean的类型,和包不包括bean;主要用途有 1.通过类型或名字getbean 2.判断是否存在特殊的bean 3.判断bean是否是单例的(这个有点不太明白,bean一般都是单例的)

FactoryBean

FactoryBean中有两个重要的方法

java 复制代码
// 示例:生产UserService类型的Bean
public class UserServiceFactoryBean implements FactoryBean<UserService> {
    
    @Override
    public Class<?> getObjectType() {
        return UserService.class;  // 声明生产UserService类型
    }
    
    @Override
    public UserService getObject() {
        return new UserServiceImpl();  // 实际生产
    }
}

getObjectType我感觉是声明对象,实际则是返回getObject这个对象,如果要拿到工厂类就加一个&,"&UserServiceFactoryBean"就返回的是实际的工厂类。

二、观察者模式

观察者模式暂时还没学


总结

要先学设计模式再学spring,感觉黑马讲的那么复杂就是为了让人报课。

相关推荐
liuyao_xianhui2 小时前
优选算法_最小基因变化_bfs_C++
java·开发语言·数据结构·c++·算法·哈希算法·宽度优先
做一个AK梦2 小时前
计算机系统概论知识点(软件设计师)
java·开发语言
東雪木2 小时前
Java学习——一访问修饰符(public/protected/default/private)的权限控制本质
java·开发语言·学习·java面试
两点王爷2 小时前
docker 创建和使用存储卷相关内容
java·docker·容器
boonya3 小时前
Embedding模型与向量维度动态切换完整方案
java·数据库·embedding·动态切换大模型
宁波阿成3 小时前
族谱管理系统架构分析与亮点总结
java·系统架构·vue·ruoyi-vue·族谱
姬成韶3 小时前
BUUCTF--[RoarCTF 2019]Easy Java
java·网络安全
组合缺一3 小时前
Solon AI Harness 首次发版
java·人工智能·ai·llm·agent·solon
程序员小寒3 小时前
JavaScript设计模式(八):命令模式实现与应用
前端·javascript·设计模式·ecmascript·命令模式