BeanFactory
BeanFactory
是 Spring 的最基础容器接口,定义了获取、查询、判断 Bean 的核心方法,是 IoC 容器的根本抽象。
java
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&";
char FACTORY_BEAN_PREFIX_CHAR = '&';
Object getBean(String name) throws BeansException;
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException;
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);
<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);
boolean containsBean(String name);
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
@Nullable
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
@Nullable
Class<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException;
String[] getAliases(String name);
}
FactoryBean
FactoryBean
是一种特殊的 Bean,本身受 Spring 管理,但容器注入时返回的是其 getObject()
生成的对象,使用 &beanName
可获取其自身。
java
public interface FactoryBean<T> {
String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";
@Nullable
T getObject() throws Exception;
@Nullable
Class<?> getObjectType();
default boolean isSingleton() {
return true;
}
}
SmartFactoryBean
SmartFactoryBean
是对 FactoryBean
的扩展,提供是否为原型(isPrototype()
)和是否应被容器提前初始化(isEagerInit()
)的控制能力。
java
public interface SmartFactoryBean<T> extends FactoryBean<T> {
default boolean isPrototype() {
return false;
}
default boolean isEagerInit() {
return false;
}
}
实现类名称 | 功能与用途简介 |
---|---|
AbstractEntityManagerFactoryBean | JPA 的 EntityManagerFactory 抽象工厂,实现 JPA 相关工厂 Bean 的基类。 |
AbstractFactoryBean | Spring FactoryBean 的基础抽象实现,简化自定义 FactoryBean 开发。 |
AbstractServiceLoaderBasedFactoryBean | 基于 Java ServiceLoader 加载服务的抽象工厂 Bean。 |
AbstractSingletonProxyFactoryBean | 创建单例代理对象的抽象工厂,用于生成代理 Bean。 |
CacheProxyFactoryBean | 创建缓存代理对象,如对缓存操作的代理封装。 |
ConcurrentMapCacheFactoryBean | 创建基于并发 ConcurrentMap 的缓存实例。 |
ConnectorServerFactoryBean | JMX 连接器服务的工厂 Bean,负责创建 JMX 连接服务器。 |
ContentNegotiationManagerFactoryBean | 创建内容协商管理器,支持根据请求头等内容协商返回的格式。 |
ConversionServiceFactoryBean | 创建 Spring 类型转换服务 ConversionService 的工厂 Bean。 |
CronTriggerFactoryBean | Quartz 定时任务中基于 Cron 表达式的触发器工厂。 |
DateTimeFormatterFactoryBean | Java 8 时间格式化器的工厂 Bean。 |
EmbeddedDatabaseFactoryBean | 嵌入式数据库(如 H2、HSQLDB、Derby)实例的创建工厂。 |
FieldRetrievingFactoryBean | 通过反射机制获取某个字段值的工厂 Bean。 |
ForkJoinPoolFactoryBean | 创建 Java ForkJoinPool 线程池实例。 |
FormattingConversionServiceFactoryBean | 创建支持格式化的类型转换服务。 |
FreeMarkerConfigurationFactoryBean | FreeMarker 模板引擎配置的工厂 Bean。 |
GsonFactoryBean | 创建 Gson JSON 序列化/反序列化工具实例。 |
Jackson2ObjectMapperFactoryBean | 创建 Jackson 的 ObjectMapper 实例,负责 JSON 处理。 |
JCacheManagerFactoryBean | JCache 缓存管理器的工厂 Bean。 |
JndiObjectFactoryBean | 从 JNDI 中查找并获取对象的工厂 Bean。 |
JobDetailFactoryBean | Quartz 作业详情 Bean 的工厂。 |
JtaTransactionManagerFactoryBean | 创建 JTA 事务管理器的工厂 Bean。 |
ListFactoryBean | 创建 List 集合 Bean。 |
LocalConnectionFactoryBean | 本地数据库连接工厂 Bean。 |
LocalContainerEntityManagerFactoryBean | 基于容器的 JPA EntityManagerFactory 工厂 Bean。 |
LocalEntityManagerFactoryBean | 本地 JPA EntityManagerFactory 工厂 Bean。 |
LocalSessionFactoryBean | Hibernate SessionFactory 的工厂 Bean。 |
MapFactoryBean | 创建 Map 集合 Bean。 |
MBeanProxyFactoryBean | 创建 JMX MBean 代理 Bean。 |
MBeanServerConnectionFactoryBean | 获取 JMX MBeanServerConnection 的工厂 Bean。 |
MBeanServerFactoryBean | 创建 JMX MBeanServer 实例。 |
MethodInvokingFactoryBean | 通过反射调用某个方法,并将其结果作为 Bean。 |
MethodInvokingJobDetailFactoryBean | Quartz 中调用方法的 JobDetail 工厂 Bean。 |
MethodLocatingFactoryBean | 查找方法反射对象的工厂 Bean。 |
ObjectFactoryCreatingFactoryBean | 创建 Spring ObjectFactory 实例。 |
PropertiesFactoryBean | 加载 Properties 文件并生成对应 Bean。 |
PropertyPathFactoryBean | 通过路径访问 Bean 属性的工厂。 |
ProviderCreatingFactoryBean | 创建 JSR-330 Provider 的工厂 Bean。 |
ProxyFactoryBean | 创建动态代理 Bean,支持 AOP 相关功能。 |
ResourceAdapterFactoryBean | 创建 JCA 资源适配器实例。 |
ScheduledExecutorFactoryBean | 创建 ScheduledExecutorService 线程池。 |
SchedulerFactoryBean | Quartz Scheduler 的工厂 Bean。 |
ScopedProxyFactoryBean | 创建作用域代理 Bean,如 session、request 作用域代理。 |
ServiceFactoryBean | 通过接口生成服务 Bean 的工厂。 |
ServiceListFactoryBean | 创建服务列表 Bean。 |
ServiceLoaderFactoryBean | 基于 Java ServiceLoader 的服务加载工厂。 |
ServiceLocatorFactoryBean | 创建服务定位器(Service Locator)工厂。 |
ServletContextAttributeFactoryBean | 获取 ServletContext 属性的工厂 Bean。 |
ServletContextParameterFactoryBean | 获取 ServletContext 参数的工厂 Bean。 |
ServletServerContainerFactoryBean | 创建 Servlet 容器相关 Bean。 |
SetFactoryBean | 创建 Set 集合 Bean。 |
SharedEntityManagerBean | 共享 JPA EntityManager 的 Bean。 |
SimpleTriggerFactoryBean | Quartz 简单触发器的工厂 Bean。 |
SortedResourcesFactoryBean | 对资源集合进行排序的工厂 Bean。 |
TaskExecutorFactoryBean | 创建 TaskExecutor 线程池。 |
ThreadPoolExecutorFactoryBean | 创建标准 ThreadPoolExecutor 线程池。 |
TransactionProxyFactoryBean | 创建事务代理 Bean。 |
WebSocketContainerFactoryBean | 创建 WebSocket 容器的工厂 Bean。 |
YamlMapFactoryBean | 加载 YAML 文件并转换成 Map Bean。 |
YamlPropertiesFactoryBean | 加载 YAML 文件并转换成 Properties Bean。 |
ObjectFactory
ObjectFactory
提供了一个延迟获取目标对象实例的统一接口。
java
@FunctionalInterface
public interface ObjectFactory<T> {
T getObject() throws BeansException;
}
ObjectProvider
ObjectProvider
是一个功能更强大的 ObjectFactory
,支持延迟获取、按条件筛选、多实例迭代和安全获取单个或唯一 Bean 的灵活依赖注入接口。
java
public interface ObjectProvider<T> extends ObjectFactory<T>, Iterable<T> {
Predicate<Class<?>> UNFILTERED = (clazz -> true);
@Override
default T getObject() throws BeansException {
Iterator<T> it = iterator();
if (!it.hasNext()) {
throw new NoSuchBeanDefinitionException(Object.class);
}
T result = it.next();
if (it.hasNext()) {
throw new NoUniqueBeanDefinitionException(Object.class, 2, "more than 1 matching bean");
}
return result;
}
default T getObject(Object... args) throws BeansException {
throw new UnsupportedOperationException("Retrieval with arguments not supported -" +
"for custom ObjectProvider classes, implement getObject(Object...) for your purposes");
}
@Nullable
default T getIfAvailable() throws BeansException {
try {
return getObject();
}
catch (NoUniqueBeanDefinitionException ex) {
throw ex;
}
catch (NoSuchBeanDefinitionException ex) {
return null;
}
}
default T getIfAvailable(Supplier<T> defaultSupplier) throws BeansException {
T dependency = getIfAvailable();
return (dependency != null ? dependency : defaultSupplier.get());
}
default void ifAvailable(Consumer<T> dependencyConsumer) throws BeansException {
T dependency = getIfAvailable();
if (dependency != null) {
dependencyConsumer.accept(dependency);
}
}
@Nullable
default T getIfUnique() throws BeansException {
try {
return getObject();
}
catch (NoSuchBeanDefinitionException ex) {
return null;
}
}
default T getIfUnique(Supplier<T> defaultSupplier) throws BeansException {
T dependency = getIfUnique();
return (dependency != null ? dependency : defaultSupplier.get());
}
default void ifUnique(Consumer<T> dependencyConsumer) throws BeansException {
T dependency = getIfUnique();
if (dependency != null) {
dependencyConsumer.accept(dependency);
}
}
@Override
default Iterator<T> iterator() {
return stream().iterator();
}
default Stream<T> stream() {
throw new UnsupportedOperationException("Element access not supported - " +
"for custom ObjectProvider classes, implement stream() to enable all other methods");
}
default Stream<T> orderedStream() {
return stream().sorted(OrderComparator.INSTANCE);
}
default Stream<T> stream(Predicate<Class<?>> customFilter) {
return stream(customFilter, true);
}
default Stream<T> orderedStream(Predicate<Class<?>> customFilter) {
return orderedStream(customFilter, true);
}
default Stream<T> stream(Predicate<Class<?>> customFilter, boolean includeNonSingletons) {
if (!includeNonSingletons) {
throw new UnsupportedOperationException("Only supports includeNonSingletons=true by default");
}
return stream().filter(obj -> customFilter.test(obj.getClass()));
}
default Stream<T> orderedStream(Predicate<Class<?>> customFilter, boolean includeNonSingletons) {
if (!includeNonSingletons) {
throw new UnsupportedOperationException("Only supports includeNonSingletons=true by default");
}
return orderedStream().filter(obj -> customFilter.test(obj.getClass()));
}
}