赞
踩
核心组件的介绍:
组件之间的关系 :
由于方法过多,仅仅展示方法分析,想要深入了解的读者可以自行结合源码解读分析,这里不做过多描述。
主要方法:
getBeanClassName()
:获取Bean的类名。setBeanClassName(String beanClassName)
:设置Bean的类名。getFactoryMethodName()
:获取工厂方法的名字(如果Bean是通过工厂方法创建的)。setFactoryMethodName(String factoryMethodName)
:设置工厂方法的名字。getScope()
:获取Bean的作用域。setScope(String scope)
:设置Bean的作用域。isSingleton()
:检查Bean是否是单例。isPrototype()
:检查Bean是否是原型。isLazyInit()
:检查Bean是否延迟初始化。getPropertyValues()
:获取Bean的属性值。getConstructorArgumentValues()
:获取构造函数参数值。getDependsOn()
:获取Bean依赖的其他Bean的名称。getAutowireCandidate()
:获取是否是自动装配候选者。getDescription()
:获取Bean的描述。getResourceDescription()
:获取资源描述。getRole()
:获取Bean的角色。BeanDefinition 的作用是描述一个 Bean 的元数据信息,包括其类名、作用域、依赖关系等。通过 BeanDefinition,Spring 容器可以了解每个 Bean 的配置信息,从而进行实例化、依赖注入等操作。
Bean定义 的关键类区别:
RootBeanDefinition
是 AbstractBeanDefinition
的直接子类。setBeanClass(Class beanClass)
方法设置 Bean 的类型,通过 setConstructorArgumentValues(ConstructorArgumentValues constructorArgumentValues)
设置构造函数参数值,以及通过其他方法设置 Bean 的属性、作用域、依赖关系等。ChildBeanDefinition
也是 AbstractBeanDefinition
的直接子类。parent
属性来继承父 Bean 的配置信息的子 Bean。RootBeanDefinition
相比,ChildBeanDefinition
可以继承父 Bean 的属性配置,并可以覆盖或添加新的属性。ChildBeanDefinition
,而是通过 XML 配置文件或者 Java 代码中的父子 Bean 定义来间接使用。AbstractBeanDefinition
是一个抽象类,用于表示 Bean 的抽象定义,定义了 Bean 的基本属性和行为 。RootBeanDefinition
和 ChildBeanDefinition
都是 AbstractBeanDefinition
的子类,因此它们继承了 AbstractBeanDefinition
中定义的一些属性和方法,如 setBeanClass()
、setScope()
等。仅仅展示抽象类AbstractBeanDefinition的定义Bean的主要行为。想要了解子类RootBeanDefinition和子类ChildBeanDefinition,以及其它定义的Bean行为的读者,可自行查看相应的源码,进行解读。
最突出的设计模式包括:
AbstractBeanDefinition
定义了一个模板方法 validate()
,该方法规定了 Bean 定义的验证流程,但是具体的验证细节交由子类实现。这符合模板方法模式的思想,即定义一个算法的骨架,将具体步骤的实现延迟到子类中。AbstractBeanDefinition
是一个抽象类,其中包含一个抽象的工厂方法 getBeanClass()
,用于获取 Bean 的类对象。具体的 Bean 类型由子类提供,符合工厂方法模式的定义,即将对象的创建延迟到子类中。AbstractBeanDefinition
中的属性 scope
、lazyInit
等代表了不同的策略,决定了 Bean 的作用域和是否延迟初始化。这些属性的值可以根据具体情况动态地设置,从而改变 Bean 的行为,符合策略模式的思想,即定义一系列算法,将它们封装起来,并且使它们可以相互替换。AbstractBeanDefinition
可以作为装饰器的基类,通过组合的方式实现装饰器模式,为 Bean 定义提供灵活的扩展机制。BeanDefinitionBuilder
类来构建 AbstractBeanDefinition
实例,它使用了建造者模式,通过一系列的方法链式调用来设置 AbstractBeanDefinition
的属性,并最终构建出一个完整的 Bean 定义对象。BeanDefinition 的注册过程通常由 BeanDefinitionRegistry
接口及其实现类(如 DefaultListableBeanFactory
)负责。
查看 DefaultListableBeanFactory
类的 registerBeanDefinition()
方法,该方法用于向容器注册 BeanDefinition。其它方法读者感兴趣,可自行查看源码。
通过一个简单的健身房会员管理系统来演示如何在日常开发中使用BeanDefinition。
需求:
- 每个会员都有一个唯一的会员编号、姓名和注册日期。
- 系统需要能够添加新会员、查询会员信息和删除会员。
public class Member {
private int memberId;
private String name;
private LocalDate registrationDate;
// 省略构造函数、getter和setter方法
}
import java.util.HashMap;
import java.util.Map;
public class MemberManagementServiceImpl {
private Map<Integer, Member> members = new HashMap<>();
private int nextMemberId = 1;
/**
* 添加新会员
*/
public void addMember(String name) {
Member member = new Member();
member.setMemberId(nextMemberId++);
member.setName(name);
member.setRegistrationDate(LocalDate.now());
members.put(member.getMemberId(), member);
}
/**
* 查询会员信息
*/
public Member getMember(int memberId) {
return members.get(memberId);
}
/**
* 删除会员
*/
public void removeMember(int memberId) {
members.remove(memberId);
}
}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 使用了BeanDefinition来声明了 MemberManagementService 的 Bean
*/
@Configuration
public class AppConfig {
@Bean
public MemberManagementService memberManagementService() {
return new MemberManagementService();
}
}
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
MemberManagementService memberManagementService = context.getBean(MemberManagementService.class);
// 添加会员
memberManagementService.addMember("Alice");
memberManagementService.addMember("Bob");
// 查询会员信息并显示
Member member1 = memberManagementService.getMember(1);
System.out.println("Member 1: " + member1.getName());
Member member2 = memberManagementService.getMember(2);
System.out.println("Member 2: " + member2.getName());
// 删除会员
memberManagementService.removeMember(1);
}
}
两周年 ~ 一起努力叭
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。