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,感觉黑马讲的那么复杂就是为了让人报课。

相关推荐
老星*7 分钟前
AI选股核心设计思路
java·ai·开源·软件开发
invicinble14 分钟前
spirng的bean的生命周期,以及为什么这么设计
spring
それども27 分钟前
Comparator.comparing 和 拆箱问题
java·jvm
星晨羽1 小时前
西门子机床opc ua协议实现变量读写及NC文件上传下载
java·spring boot
无巧不成书02182 小时前
零基础Java网络编程全解:从核心概念到Socket实战,一文打通Java网络通信
java·开发语言·网络
三水不滴2 小时前
SpringAI + SpringDoc + Knife4j 构建企业级智能问卷系统
经验分享·spring boot·笔记·后端·spring
aq55356002 小时前
Workstation神技:一键克隆调试环境
java·开发语言
今天你TLE了吗3 小时前
LLM到Agent&RAG——AI知识点概述 第六章:Function Call函数调用
java·人工智能·学习·语言模型·大模型
Rcnhtin3 小时前
RocketMQ
java·linux·rocketmq
JH30734 小时前
RedLock-红锁
java·redis