广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Spring BeanFactory工厂使用教程
  • 249
分享到

Spring BeanFactory工厂使用教程

Spring BeanFactorySpring Bean工厂 2023-02-06 18:02:39 249人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

首先,我们想要知道一个接口有哪些功能,就必须要看这个接口的源代码,在idea中,选中这个接口Ctrl+F12,来查看这个接口里面有哪些方法: 表面上来看,功能其实很少,查看源码及其

首先,我们想要知道一个接口有哪些功能,就必须要看这个接口的源代码,在idea中,选中这个接口Ctrl+F12,来查看这个接口里面有哪些方法:

表面上来看,功能其实很少,查看源码及其方法、功能

package org.springframework.beans.factory;
import org.springframework.beans.BeansException;
import org.springframework.core.ResolvableType;
import org.springframework.lang.Nullable;
public interface BeanFactory {
    // factoryBean 的转义标识符。
	String FACTORY_BEAN_PREFIX = "&";
    // 根据 name 从容器中拿对应的 bean。
	Object getBean(String name) throws BeansException;
    // 根据 name 和 type 从容器中拿对应的 bean,要对 bean 的类型做校验。
	<T> T getBean(String name, Class<T> requiredType) throws BeansException;
    // 在容器中能否找到与 name 匹配的 bean 或者 beanDefinition。
	boolean containsBean(String name);
	// 判断 name 对对应的 bean 是不是 单例。
	boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
	boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
	// 判断 name 对应的 bean 与指定的类型是否匹配。
	boolean isTypeMatch(String name, ResolvableType typeToMatch) throws 
     NoSuchBeanDefinitionException;
	boolean isTypeMatch(String name, @Nullable Class<?> typeToMatch) throws 
       NoSuchBeanDefinitionException;
	//根据 name 获取对应的 bean 的类型。
	@Nullable
	Class<?> getType(String name) throws NoSuchBeanDefinitionException;
    // 根据 name 获取对应 bean 的 别名。
	String[] getAliases(String name);
}

BeanFactory表面上来看只有 getBean有点用,实际上我们不能只光看它接口,还要看它的实现类,实际上控制反转、基本的依赖注入、直至 Bean 的生命周期的各种功能,都由它的实现类提供

  • HierarchicalBeanFactory:提供父容器的访问功能
  • ListableBeanFactory:提供了批量获取Bean的方法
  • AutowireCapableBeanFactory:在BeanFactory基础上实现对已存在实例的管理
  • ConfigurableBeanFactory:主要单例bean的注册,生成实例,以及统计单例bean
  • ConfigurableListableBeanFactory:继承了上述的所有接口,增加了其他功能:比如类加载器,类型转化,属性编辑器,BeanPostProcessor,作用域,bean定义,处理bean依赖关系, bean如何销毁…
  • 实现类DefaultListableBeanFactory:实现了ConfigurableListableBeanFactory,注册BeanDefinition,实现上述BeanFactory所有功能

来看一下DefaultListableBeanFactory的继承关系图:

可以看到,BeanFactory只是它实现的很少一部分,除了BeanFactory提供的getBean,还有其他方法,所以我们不能光看一个接口,还要看它的具体实现类

在这里我们就只看它的DefaultSingletonBeanReGIStry接口中的单例对象,这个为大家比较熟悉的,来看源码:

public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
	
	
	private static final int SUPPRESSED_EXCEPTIONS_LIMIT = 100;
	
	
	private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
	
	
	private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
	
	
	private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap<>(16);
	
	
	private final Set<String> registeredSingletons = new LinkedHashSet<>(256);
	
	
	private final Set<String> singletonsCurrentlyInCreation =
			Collections.newSetFromMap(new ConcurrentHashMap<>(16));
	
	
	private final Set<String> inCreationCheckExclusions =
			Collections.newSetFromMap(new ConcurrentHashMap<>(16));
	
	@Nullable
	
	private Set<Exception> suppressedExceptions;
	
	
	private boolean singletonsCurrentlyInDestruction = false;
	
	
	private final Map<String, Object> disposableBeans = new LinkedHashMap<>();
	
	
	private final Map<String, Set<String>> containedBeanMap = new ConcurrentHashMap<>(16);
	
	
	private final Map<String, Set<String>> dependentBeanMap = new ConcurrentHashMap<>(64);
	
	
	private final Map<String, Set<String>> dependenciesForBeanMap = new ConcurrentHashMap<>(64);
	
	@Override
	public void registerSingleton(String beanName, Object singletonObject) throws IllegalStateException {
		//断言beanName是否为空
		Assert.notNull(beanName, "Bean name must not be null");
		//断言singletonObject是否为空
		Assert.notNull(singletonObject, "Singleton object must not be null");
		synchronized (this.singletonObjects) {
			//从一级缓存中通过beanName拿取Bean
			Object oldObject = this.singletonObjects.get(beanName);
			//一级缓存中存在了,抛出IllegalStateException
			if (oldObject != null) {
				throw new IllegalStateException("Could not register object [" + singletonObject +
						"] under bean name '" + beanName + "': there is already object [" + oldObject + "] bound");
			}
			//如果不存在,将singletonObject添加到一级缓存
			addSingleton(beanName, singletonObject);
		}
	}
	
	protected void addSingleton(String beanName, Object singletonObject) {
		synchronized (this.singletonObjects) {
			//将singletonObject添加到一级缓存中,同时移除二级、三级缓存、并标记当前Bean已注册
			this.singletonObjects.put(beanName, singletonObject);
			//移除三级缓存
			this.singletonFactories.remove(beanName);
			//移除二级缓存
			this.earlySingletonObjects.remove(beanName);
			//标记当前Bean已被注册
			this.registeredSingletons.add(beanName);
		}
	}
	
	protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {
		//断言singletonFactory不为空
		Assert.notNull(singletonFactory, "Singleton factory must not be null");
		//同步加
		synchronized (this.singletonObjects) {
			//单例缓存池中没有包含当前的bean
			if (!this.singletonObjects.containsKey(beanName)) {
				//加入到三级缓存中,,,,,暴露早期对象用于解决循环依赖
				this.singletonFactories.put(beanName, singletonFactory);
				//从二级缓存中移除
				this.earlySingletonObjects.remove(beanName);
				//标记当前Bean已经被注册过
				this.registeredSingletons.add(beanName);
			}
		}
	}
	
	@Override
	@Nullable
	public Object getSingleton(String beanName) {
		//在这里 系统一般是允许早期对象引用的 allowEarlyReference通过这个参数可以控制解决循环依赖
		return getSingleton(beanName, true);
	}
	
	@Nullable
	protected Object getSingleton(String beanName, boolean allowEarlyReference) {
		// Quick check for existing instance without full singleton lock
		
		Object singletonObject = this.singletonObjects.get(beanName);
		//如果一级缓存为空,并且标记正在创建
		if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
			
			singletonObject = this.earlySingletonObjects.get(beanName);
			
			if (singletonObject == null && allowEarlyReference) {
				synchronized (this.singletonObjects) {
					// Consistent creation of early reference within full singleton lock
					
					singletonObject = this.singletonObjects.get(beanName);
					//一级缓存中没拿到
					if (singletonObject == null) {
						//尝试从二级缓存中去拿
						singletonObject = this.earlySingletonObjects.get(beanName);
						//二级缓存还是空
						if (singletonObject == null) {
							
							ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
							//三级缓存中获取的对象不为空
							if (singletonFactory != null) {
								
								singletonObject = singletonFactory.getObject();
								//把早期对象放置在二级缓存,
								this.earlySingletonObjects.put(beanName, singletonObject);
								//ObjectFactory 包装对象从三级缓存中删除掉
								this.singletonFactories.remove(beanName);
							}
						}
					}
				}
			}
		}
		//返回这个Bean
		return singletonObject;
	}
	
	public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
		//断言beanName不为空
		Assert.notNull(beanName, "Bean name must not be null");
		//同步加锁
		synchronized (this.singletonObjects) {
			//尝试从一级缓存池中获取对象
			Object singletonObject = this.singletonObjects.get(beanName);
			//从一级缓存中没拿到
			if (singletonObject == null) {
				//当前是否是正在销毁,是的话抛出BeanCreationNotAllowedException异常
				if (this.singletonsCurrentlyInDestruction) {
					throw new BeanCreationNotAllowedException(beanName,
							"Singleton bean creation not allowed while singletons of this factory are in destruction " +
									"(Do not request a bean from a BeanFactory in a destroy method implementation!)");
				}
				//判断是否已启用Debug调试模式
				if (logger.isDebugEnabled()) {
					logger.debug("Creating shared instance of singleton bean '" + beanName + "'");
				}
				
				beforeSingletonCreation(beanName);
				//标记是否为新创建的单例Bean
				boolean newSingleton = false;
				//标记是否记录抑制异常
				boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
				//如果为空,创建抑制异常集合
				if (recordSuppressedExceptions) {
					this.suppressedExceptions = new LinkedHashSet<>();
				}
				try {
					// 初始化 bean
					// 这个过程其实是调用 createBean() 方法
					singletonObject = singletonFactory.getObject();
					//标记这个Bean是新创建的
					newSingleton = true;
				} catch (IllegalStateException ex) {
					// Has the singleton object implicitly appeared in the meantime ->
					// if yes, proceed with it since the exception indicates that state.
					//
					//在此期间是否隐式创建了单例对象 -> 如果是,则继续处理它,因为异常指该状态。
					singletonObject = this.singletonObjects.get(beanName);
					//一级缓存中没有,抛出异常
					if (singletonObject == null) {
						throw ex;
					}
				} catch (BeanCreationException ex) {
					//记录抑制异常
					if (recordSuppressedExceptions) {
						//遍历抑制异常集合,添加相关原因
						for (Exception suppressedException : this.suppressedExceptions) {
							ex.addRelatedCause(suppressedException);
						}
					}
					throw ex;
				} finally {
					//记录抑制异常集合置空,复用
					if (recordSuppressedExceptions) {
						this.suppressedExceptions = null;
					}
					//后置处理
					//主要做的事情就是把singletonsCurrentlyInCreation标记正在创建的bean从集合中移除
					afterSingletonCreation(beanName);
				}
				//是新建的单例Bean,添加到一级缓存中去
				if (newSingleton) {
					addSingleton(beanName, singletonObject);
				}
			}
			//返回单例Bean
			return singletonObject;
		}
	}
	
	protected void onSuppressedException(Exception ex) {
		synchronized (this.singletonObjects) {
			//抑制异常集合不为空,且小于SUPPRESSED_EXCEPTIONS_LIMIT最大限制
			if (this.suppressedExceptions != null && this.suppressedExceptions.size() < SUPPRESSED_EXCEPTIONS_LIMIT) {
				//向抑制集合中添加异常
				this.suppressedExceptions.add(ex);
			}
		}
	}
	
	protected void removeSingleton(String beanName) {
		//同步加锁
		synchronized (this.singletonObjects) {
			//从一级缓存中移除
			this.singletonObjects.remove(beanName);
			//从三级缓存中移除
			this.singletonFactories.remove(beanName);
			//从二级缓存中移除
			this.earlySingletonObjects.remove(beanName);
			//从Bean注册标记集合中移除
			this.registeredSingletons.remove(beanName);
		}
	}
	
	@Override
	public boolean containsSingleton(String beanName) {
		//判断一级缓存中是否存在该Bean
		return this.singletonObjects.containsKey(beanName);
	}
	
	@Override
	public String[] getSingletonNames() {
		synchronized (this.singletonObjects) {
			//获取已注册的单例Bean名字的集合
			return StringUtils.toStringArray(this.registeredSingletons);
		}
	}
	
	@Override
	public int getSingletonCount() {
		synchronized (this.singletonObjects) {
			//获取已注册单例Bean实例的个数
			return this.registeredSingletons.size();
		}
	}
	
	public void setCurrentlyInCreation(String beanName, boolean inCreation) {
		//断言Bean不为空
		Assert.notNull(beanName, "Bean name must not be null");
		//如果未标记,将beanName加到inCreationCheckExclusions集合中,已标记则移除
		if (!inCreation) {
			this.inCreationCheckExclusions.add(beanName);
		} else {
			this.inCreationCheckExclusions.remove(beanName);
		}
	}
	
	public boolean isCurrentlyInCreation(String beanName) {
		Assert.notNull(beanName, "Bean name must not be null");
		return (!this.inCreationCheckExclusions.contains(beanName) && isActuallyInCreation(beanName));
	}
	
	protected boolean isActuallyInCreation(String beanName) {
		return isSingletonCurrentlyInCreation(beanName);
	}
	
	public boolean isSingletonCurrentlyInCreation(String beanName) {
		return this.singletonsCurrentlyInCreation.contains(beanName);
	}
	
	protected void beforeSingletonCreation(String beanName) {
		if (!this.inCreationCheckExclusions.contains(beanName) && !this.singletonsCurrentlyInCreation.add(beanName)) {
			throw new BeanCurrentlyInCreationException(beanName);
		}
	}
	
	protected void afterSingletonCreation(String beanName) {
		if (!this.inCreationCheckExclusions.contains(beanName) && !this.singletonsCurrentlyInCreation.remove(beanName)) {
			throw new IllegalStateException("Singleton '" + beanName + "' isn't currently in creation");
		}
	}
	
	public void registerDisposableBean(String beanName, DisposableBean bean) {
		synchronized (this.disposableBeans) {
			this.disposableBeans.put(beanName, bean);
		}
	}
	
	public void registerContainedBean(String containedBeanName, String containingBeanName) {
		synchronized (this.containedBeanMap) {
			Set<String> containedBeans =
					this.containedBeanMap.computeIfAbsent(containingBeanName, k -> new LinkedHashSet<>(8));
			if (!containedBeans.add(containedBeanName)) {
				return;
			}
		}
		registerDependentBean(containedBeanName, containingBeanName);
	}
	
	public void registerDependentBean(String beanName, String dependentBeanName) {
		//获取原始的beanName
		String canonicalName = canonicalName(beanName);
		// 添加 <canonicalName, <dependentBeanName>> 到 dependentBeanMap 中
		synchronized (this.dependentBeanMap) {
			Set<String> dependentBeans =
					this.dependentBeanMap.computeIfAbsent(canonicalName, k -> new LinkedHashSet<>(8));
			if (!dependentBeans.add(dependentBeanName)) {
				return;
			}
		}
		// 添加 <dependentBeanName, <canonicalName>> 到 dependenciesForBeanMap 中
		synchronized (this.dependenciesForBeanMap) {
			Set<String> dependenciesForBean =
					this.dependenciesForBeanMap.computeIfAbsent(dependentBeanName, k -> new LinkedHashSet<>(8));
			dependenciesForBean.add(canonicalName);
		}
	}
	
	//判断指定的 bean 是否依赖于 dependentBeanName
	protected boolean isDependent(String beanName, String dependentBeanName) {
		synchronized (this.dependentBeanMap) {
			return isDependent(beanName, dependentBeanName, null);
		}
	}
	//判断指定的 bean 是否依赖于 dependentBeanName
	private boolean isDependent(String beanName, String dependentBeanName, @Nullable Set<String> alreadySeen) {
		// alreadySeen 已经检测的依赖 bean
		if (alreadySeen != null && alreadySeen.contains(beanName)) {
			return false;
		}
		// 获取原始 beanName
		String canonicalName = canonicalName(beanName);
		//获取创建当前bean 所依赖的bean的名称集合
		Set<String> dependentBeans = this.dependentBeanMap.get(canonicalName);
		//不依赖任何前置Bean 直接返回
		if (dependentBeans == null) {
			return false;
		}
		// 存在,则证明存在已经注册的依赖
		if (dependentBeans.contains(dependentBeanName)) {
			return true;
		}
		// 递归检测依赖
		for (String transitiveDependency : dependentBeans) {
			if (alreadySeen == null) {
				alreadySeen = new HashSet<>();
			}
			// 添加到 alreadySeen 中
			alreadySeen.add(beanName);
			//递归检查依赖
			if (isDependent(transitiveDependency, dependentBeanName, alreadySeen)) {
				return true;
			}
		}
		return false;
	}
	
	//判断beanName是否注册为依赖Bean
	protected boolean hasDependentBean(String beanName) {
		return this.dependentBeanMap.containsKey(beanName);
	}
	
	public String[] getDependentBeans(String beanName) {
		//Bean依赖集合
		Set<String> dependentBeans = this.dependentBeanMap.get(beanName);
		if (dependentBeans == null) {
			return new String[0];
		}
		synchronized (this.dependentBeanMap) {
			return StringUtils.toStringArray(dependentBeans);
		}
	}
	
	public String[] getDependenciesForBean(String beanName) {
		Set<String> dependenciesForBean = this.dependenciesForBeanMap.get(beanName);
		if (dependenciesForBean == null) {
			return new String[0];
		}
		synchronized (this.dependenciesForBeanMap) {
			return StringUtils.toStringArray(dependenciesForBean);
		}
	}
	
	public void destroySingletons() {
		if (logger.isTraceEnabled()) {
			logger.trace("Destroying singletons in " + this);
		}
		//标记为正在销毁
		synchronized (this.singletonObjects) {
			this.singletonsCurrentlyInDestruction = true;
		}
		String[] disposableBeanNames;
		//获取需要销毁的Bean集合
		synchronized (this.disposableBeans) {
			disposableBeanNames = StringUtils.toStringArray(this.disposableBeans.keySet());
		}
		//循环校徽单例Bean
		for (int i = disposableBeanNames.length - 1; i >= 0; i--) {
			destroySingleton(disposableBeanNames[i]);
		}
		//	清空依赖和映射关系缓存
		this.containedBeanMap.clear();
		this.dependentBeanMap.clear();
		this.dependenciesForBeanMap.clear();
		// 清理Bean的一级二级三级缓存
		clearSingletonCache();
	}
	
	protected void clearSingletonCache() {
		synchronized (this.singletonObjects) {
			this.singletonObjects.clear();
			this.singletonFactories.clear();
			this.earlySingletonObjects.clear();
			this.registeredSingletons.clear();
			this.singletonsCurrentlyInDestruction = false;
		}
	}
	
	public void destroySingleton(String beanName) {
		// Remove a registered singleton of the given name, if any.
		//从缓存中移除当前bean的相关信息,由于不知道在哪里发生异常,所以我们把跟当前bean的所有缓存记录都清除
		removeSingleton(beanName);
		// Destroy the corresponding DisposableBean instance.
		//创建一个变量用于接受 实现了DisposableBean接口的对象变量
		DisposableBean disposableBean;
		synchronized (this.disposableBeans) {
			disposableBean = (DisposableBean) this.disposableBeans.remove(beanName);
		}
		//进行bean的销毁
		destroyBean(beanName, disposableBean);
	}
	
	protected void destroyBean(String beanName, @Nullable DisposableBean bean) {
		// Trigger destruction of dependent beans first...
		// 销毁dependentBeanMap中保存的是当前bean和依赖bean之间的映射
		Set<String> dependencies;
		synchronized (this.dependentBeanMap) {
			// Within full synchronization in order to guarantee a disconnected Set
			//把当前创建dependon 依赖的bean从缓存中移除并且返回处理
			dependencies = this.dependentBeanMap.remove(beanName);
		}
		//如果bean依赖不为空
		if (dependencies != null) {
			if (logger.isTraceEnabled()) {
				logger.trace("Retrieved dependent beans for bean '" + beanName + "': " + dependencies);
			}
			//递归销毁bean
			for (String dependentBeanName : dependencies) {
				destroySingleton(dependentBeanName);
			}
		}
		// Actually destroy the bean now...
		//真正的调用bean的destory()方法
		if (bean != null) {
			try {
				bean.destroy();
			} catch (Throwable ex) {
				if (logger.isWarnEnabled()) {
					logger.warn("Destruction of bean with name '" + beanName + "' threw an exception", ex);
				}
			}
		}
		// 删除bean的属性关系的映射
		Set<String> containedBeans;
		synchronized (this.containedBeanMap) {
			// Within full synchronization in order to guarantee a disconnected Set
			containedBeans = this.containedBeanMap.remove(beanName);
		}
		if (containedBeans != null) {
			for (String containedBeanName : containedBeans) {
				destroySingleton(containedBeanName);
			}
		}
		// Remove destroyed bean from other beans' dependencies.
		//销毁dependentBeanMap 中 Bean的依赖
		synchronized (this.dependentBeanMap) {
			for (Iterator<Map.Entry<String, Set<String>>> it = this.dependentBeanMap.entrySet().iterator(); it.hasNext(); ) {
				Map.Entry<String, Set<String>> entry = it.next();
				Set<String> dependenciesToClean = entry.getValue();
				dependenciesToClean.remove(beanName);
				if (dependenciesToClean.isEmpty()) {
					it.remove();
				}
			}
		}
		// Remove destroyed bean's prepared dependency infORMation.
		//从dependenciesForBeanMap集合移除
		this.dependenciesForBeanMap.remove(beanName);
	}
	
	
	@Override
	public final Object getSingletonMutex() {
		return this.singletonObjects;
	}
}

它的方法大多为私有的,可以通过debug和反射,在这里我们通过反射来获取私有的成员变量:

  // DefaultSingletonBeanRegistry类管理所有的单例对象
     //获取所有的私有成员变量
        Field singletonObjects = 
       DefaultSingletonBeanRegistry.class.getDeclaredField("singletonObjects");
      //允许可以访问私有成员变量
        singletonObjects.setAccessible(true);
        //通过反射获取
       //获取beanFactory
        ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
      //反射调用,获取beanFactory的属性
        Map<String, Object> map = (Map<String, Object>) singletonObjects.get(beanFactory);
       //过滤,获取component相关的
        map.entrySet().stream().filter(e -> e.geTKEy().startsWith("component"))
                .forEach(e -> {
                    System.out.println(e.getKey() + "=" + e.getValue());
                });

总结

BeanFactory 能干点啥?

  • 表面上只有 getBean
  • 实际上控制反转、基本的依赖注入、直至 Bean 的生命周期的各种功能,都由它的实现类提供
  • 例子中通过反射查看了它的成员变量 singletonObjects,内部包含了所有的单例 bean

到此这篇关于Spring BeanFactory工厂使用教程的文章就介绍到这了,更多相关Spring BeanFactory内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Spring BeanFactory工厂使用教程

本文链接: https://www.lsjlt.com/news/194391.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring BeanFactory工厂使用教程
    首先,我们想要知道一个接口有哪些功能,就必须要看这个接口的源代码,在idea中,选中这个接口Ctrl+F12,来查看这个接口里面有哪些方法: 表面上来看,功能其实很少,查看源码及其...
    99+
    2023-02-06
    Spring BeanFactory Spring Bean工厂
  • Spring容器BeanFactory怎么使用
    本篇内容主要讲解“Spring容器BeanFactory怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring容器BeanFactory怎么使用”吧!Spring容器什么是Sprin...
    99+
    2023-06-03
  • Spring容器-BeanFactory和ApplicationContext使用详解
    目录将BeanFactory和ApplicationContext作为容器使用BeanFactory容器ApplicationContext容器Spring内嵌Web容器的过程将Be...
    99+
    2023-05-17
    Spring BeanFactory ApplicationContext Spring 容器
  • 在Spring中如何使用BeanFactory进行解析bean
    这篇文章将为大家详细讲解有关在Spring中如何使用BeanFactory进行解析bean,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在该文中来讲讲Spring框架中BeanFactory...
    99+
    2023-05-31
    spring beanfactory bean
  • 工厂方法在Spring框架中的运用
    我们都知道Spring中IOC是使用的工厂模式,但是对于实现细节就一知半解了,今天这篇文章就带大家解读Spring中是如何使用工厂模式的。 在上篇文章中我们懂了什么是工厂模式,这篇文...
    99+
    2022-11-13
    Java 工厂方法 Spring框架
  • Spring MVC使用教程
    Spring MVC使用教程?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。什么是Spring MVC  Spring MVC属于SpringFrameWork的后续产品,已...
    99+
    2023-05-31
    spring mvc
  • 工厂方法在Spring框架中怎么运用
    今天小编给大家分享一下工厂方法在Spring框架中怎么运用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、BeanFact...
    99+
    2023-07-04
  • Flask使用工厂模式
    目录1、工厂模式2、使用工厂方法创建 app 对象 1、工厂模式 在面向对象编程中,工厂模式是开发过程中最常用的设计模式之一,属于创建型模式,就是通过一个接口函数或对象来创建其他对象...
    99+
    2022-11-12
  • Laravel应用程序中怎么使用模型工厂
    本文小编为大家详细介绍“Laravel应用程序中怎么使用模型工厂”,内容详细,步骤清晰,细节处理妥当,希望这篇“Laravel应用程序中怎么使用模型工厂”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Laravel...
    99+
    2023-07-04
  • 教你使用idea搭建ssm详细教程(Spring+Spring Mvc+Mybatis)
    目录一、创建maven项目二、配置tomcat三、添加web模块四、添加工件五、为项目添加tomcat的jar包六、idea不会编译src下的mapper.xml文件七、将Sprin...
    99+
    2022-11-12
  • Python 教程中如何使用 Spring?
    Python 是一种广泛使用的编程语言,而 Spring 则是一种流行的 Java 开发框架。虽然 Python 和 Java 是两种不同的编程语言,但 Python 开发者仍然可以使用 Spring 框架来构建他们的应用程序。本文将介绍如...
    99+
    2023-08-31
    教程 spring numpy
  • 怎么在Java中使用线程工厂监控线程池
    这期内容当中小编将会给大家带来有关怎么在Java中使用线程工厂监控线程池,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。ThreadFactory线程池中的线程从哪里来呢?就是ThreadFoctorypu...
    99+
    2023-06-14
  • 【工具】MySQL Workbench使用教程
    目录 1.安装登陆 2.建库 3.建表 4.表建好之后,鼠标轻放在table上,会出现三个icon, 5.给user表中添加数据,MySQL基础语法  6.界面认识 7.导入和导出sql Data Export Data Import/Re...
    99+
    2023-09-06
    mysql 数据库 database
  • Springboot工具类StringUtils使用教程
    目录org.springframework.util.StringUtils字符串操作在实际的业务开发中,除了经常有针对对象的判断或操作以外,经常也会遇到的就是字符串的判断和操作。比...
    99+
    2022-12-30
    Springboot工具类StringUtils Springboot StringUtils
  • Springboot工具类FileCopyUtils使用教程
    目录前言ResourceFileCopyUtilsStreamUtils前言 Spring内置的工具类里,最喜欢用的就是文件读写这一部分,虽然原生的写法也没几句,但是就是懒,不想循环...
    99+
    2022-12-30
    Springboot工具类FileCopyUtils Springboot FileCopyUtils
  • Springboot工具类ReflectionUtils使用教程
    目录前言ReflectionUtils对属性的操作对方法的操作前言 ReflectionUtils应该是Springboot内置工具类梳理的最后一篇了,可能很多人都没有听说过这个工具...
    99+
    2022-12-30
    Springboot工具类ReflectionUtils Springboot ReflectionUtils
  • win10易升工具使用教程
    win10系统默认是开启了自动更新功能的,不过有些网友的电脑不能自动更新系统,手动更新失败后想知道还有什么方法可以更新新版本win10。让我们一起来看看今天小编要为大家介绍的win10易升工具使用教程。1、打开win10升级工具,接受许可条...
    99+
    2023-07-10
  • hutool 工具类基本使用教程
    在之前没有接触到这个工具类的时候,感觉自己好像根本就不知道这个的存在,再次之前没有一个完善的知识体系,但是在发现这个工具类之后,才真的发现这个工具类是真的好用,下面我就简单的介绍一下...
    99+
    2022-11-12
  • win7共享工具的使用教程
    不管是在工作中还是在生活中,我们总是经常需要与人相互传输文件,要是遇到大文件需要传输那可就麻烦了,大文件的传输要很久。为了避免这种麻烦的发生,我们需要学习如何设置局域网共享,这样就不必担心大文件传输了。下面,我们一起来看看win7共享工具的...
    99+
    2023-07-16
  • Java工厂模式的使用细则介绍
    目录工厂模式简单工厂模式工厂方法模式抽象工厂模式工厂模式 工厂模式顾名思义就是生产实例的工厂,使用工厂模式不会在程序中使用new关键字创建实例。而是将创建对象的细节隐藏,对外提供统一...
    99+
    2023-02-21
    Java工厂模式 Java工厂设计模式 设计模式工厂模式
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作