| package com.atguigu.spring.bean; |
| |
| public class Monster { |
| |
| private Integer id = 10 ; |
| |
| private String nickname = "牛魔王"; |
| |
| private String skill = "芭蕉扇"; |
| |
| public Monster() { |
| System.out.println("monster 创建.."); |
| } |
| |
| public Monster(Integer id, String nickname, String skill) { |
| |
| this.id = id; |
| this.nickname = nickname; |
| this.skill = skill; |
| } |
| |
| public Monster( String nickname, String skill,Integer id) { |
| this.id = id; |
| this.nickname = nickname; |
| this.skill = skill; |
| } |
| |
| public Integer getId() { |
| return id; |
| } |
| |
| public void setId(Integer id) { |
| this.id = id; |
| } |
| |
| public String getNickname() { |
| return nickname; |
| } |
| |
| public void setNickname(String nickname) { |
| this.nickname = nickname; |
| } |
| |
| public String getSkill() { |
| return skill; |
| } |
| |
| public void setSkill(String skill) { |
| this.skill = skill; |
| } |
| |
| @Override |
| public String toString() { |
| return "Monster [id=" + id + ", nickname=" + nickname + ", skill=" |
| + skill + "]"; |
| } |
| |
| } |
| <?xml version="1.0" encoding="UTF-8"?> |
| <beans xmlns="http://www.springframework.org/schema/beans" |
| xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| xmlns:p="http://www.springframework.org/schema/p" |
| xmlns:util="http://www.springframework.org/schema/util" |
| xmlns:context="http://www.springframework.org/schema/context" |
| xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd |
| http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd |
| http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> |
| |
| |
| <bean id="id01" class="com.atguigu.spring.bean.Monster" |
| scope="prototype"/> |
| |
| </beans> |
| package com.atguigu.spring.test; |
| |
| import org.springframework.context.ApplicationContext; |
| import org.springframework.context.support.ClassPathXmlApplicationContext; |
| |
| public class ProtoType { |
| |
| public static void main(String[] args) { |
| ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); |
| |
| Object bean = applicationContext.getBean("id01"); |
| System.out.println("bean" + bean); |
| |
| Object bean2 = applicationContext.getBean("id01"); |
| System.out.println("bean2" + bean2); |
| |
| System.out.println(bean == bean2); |
| |
| } |
| |
| } |
| Object getBean(String name) throws BeansException; |
| @Override |
| public Object getBean(String name) throws BeansException { |
| assertBeanFactoryActive(); |
| return getBeanFactory().getBean(name); |
| } |
| @Override |
| public abstract ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException; |
| @Override |
| public final ConfigurableListableBeanFactory getBeanFactory() { |
| synchronized (this.beanFactoryMonitor) { |
| if (this.beanFactory == null) { |
| throw new IllegalStateException("BeanFactory not initialized or already closed - " + |
| "call 'refresh' before accessing beans via the ApplicationContext"); |
| } |
| return this.beanFactory; |
| } |
| } |
| @Override |
| public Object getBean(String name) throws BeansException { |
| assertBeanFactoryActive(); |
| return getBeanFactory().getBean(name); |
| } |
| |
| Object getBean(String name) throws BeansException; |
| @Override |
| public Object getBean(String name) throws BeansException { |
| return doGetBean(name, null, null, false); |
| } |
| protected <T> T doGetBean( |
| final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly) |
| throws BeansException { |
| |
| final String beanName = transformedBeanName(name); |
| Object bean; |
| |
| |
| Object sharedInstance = getSingleton(beanName); |
| if (sharedInstance != null && args == null) { |
| if (logger.isDebugEnabled()) { |
| if (isSingletonCurrentlyInCreation(beanName)) { |
| logger.debug("Returning eagerly cached instance of singleton bean '" + beanName + |
| "' that is not fully initialized yet - a consequence of a circular reference"); |
| } |
| else { |
| logger.debug("Returning cached instance of singleton bean '" + beanName + "'"); |
| } |
| } |
| bean = getObjectForBeanInstance(sharedInstance, name, beanName, null); |
| } |
| |
| else { |
| |
| |
| if (isPrototypeCurrentlyInCreation(beanName)) { |
| throw new BeanCurrentlyInCreationException(beanName); |
| } |
| |
| |
| BeanFactory parentBeanFactory = getParentBeanFactory(); |
| if (parentBeanFactory != null && !containsBeanDefinition(beanName)) { |
| |
| String nameToLookup = originalBeanName(name); |
| if (args != null) { |
| |
| return (T) parentBeanFactory.getBean(nameToLookup, args); |
| } |
| else { |
| |
| return parentBeanFactory.getBean(nameToLookup, requiredType); |
| } |
| } |
| |
| if (!typeCheckOnly) { |
| markBeanAsCreated(beanName); |
| } |
| |
| try { |
| final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName); |
| checkMergedBeanDefinition(mbd, beanName, args); |
| |
| |
| String[] dependsOn = mbd.getDependsOn(); |
| if (dependsOn != null) { |
| for (String dependsOnBean : dependsOn) { |
| if (isDependent(beanName, dependsOnBean)) { |
| throw new BeanCreationException("Circular depends-on relationship between '" + |
| beanName + "' and '" + dependsOnBean + "'"); |
| } |
| registerDependentBean(dependsOnBean, beanName); |
| getBean(dependsOnBean); |
| } |
| } |
| |
| |
| if (mbd.isSingleton()) { |
| sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() { |
| @Override |
| public Object getObject() throws BeansException { |
| try { |
| return createBean(beanName, mbd, args); |
| } |
| catch (BeansException ex) { |
| |
| |
| |
| destroySingleton(beanName); |
| throw ex; |
| } |
| } |
| }); |
| bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd); |
| } |
| |
| else if (mbd.isPrototype()) { |
| |
| Object prototypeInstance = null; |
| try { |
| beforePrototypeCreation(beanName); |
| prototypeInstance = createBean(beanName, mbd, args); |
| } |
| finally { |
| afterPrototypeCreation(beanName); |
| } |
| bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd); |
| } |
| |
| else { |
| String scopeName = mbd.getScope(); |
| final Scope scope = this.scopes.get(scopeName); |
| if (scope == null) { |
| throw new IllegalStateException("No Scope registered for scope '" + scopeName + "'"); |
| } |
| try { |
| Object scopedInstance = scope.get(beanName, new ObjectFactory<Object>() { |
| @Override |
| public Object getObject() throws BeansException { |
| beforePrototypeCreation(beanName); |
| try { |
| return createBean(beanName, mbd, args); |
| } |
| finally { |
| afterPrototypeCreation(beanName); |
| } |
| } |
| }); |
| bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd); |
| } |
| catch (IllegalStateException ex) { |
| throw new BeanCreationException(beanName, |
| "Scope '" + scopeName + "' is not active for the current thread; " + |
| "consider defining a scoped proxy for this bean if you intend to refer to it from a singleton", |
| ex); |
| } |
| } |
| } |
| catch (BeansException ex) { |
| cleanupAfterBeanCreationFailure(beanName); |
| throw ex; |
| } |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术