提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
一、工厂模式
这段文字主要阐述了 Spring 框架的核心设计理念,重点解释了什么是 BOP 以及 IOC 的具体实现方式。以下是详细解读:
- Spring 的设计理念:BOP (Bean Oriented Programming)
核心主角 :文中强调 Spring 是面向 Bean 的编程。在 Spring 中,一切都是围绕 "Bean" 展开的。
类比理解:就像在面向对象编程(OOP)中 "Object(对象)" 是基础一样,在 Spring 中 "Bean" 就是基础。没有对象就没有 OOP,同样,没有 Bean 也就没有 Spring。
管理方式 :Spring 提供了 IoC 容器,通过配置文件或注解来管理这些 Bean 之间的依赖关系。
- 控制反转 (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,感觉黑马讲的那么复杂就是为了让人报课。