在下面的代码中,
1)
创造&启动实现类的新依赖容器(尚未实例化)。 appContext
获取该容器的句柄。
ApplicationContext appContext = new ClassPathXmlApplicationContext("Springbeans.xml");
2)实例化一个名为bean的类(messagebean
}。使用服务定位器模式 mBean
从容器中获取该实例的句柄。
MessageBean mBean = (MessageBean)appContext.getBean("messagebean");
3) 销毁所有bean并关闭依赖容器。
(ConfigurableApplicationContext)appContext.close();
以下是messagebean
Springbeans.xml
定义
<beans ...>
<bean id="messagebean" class="com.xyz.spring.MessageBean">
<property name="message" value="hello" />
</bean>
</beans>
根据上述理解,执行messagebean
后实现(getBean()
)是否实例化?
答案 0 :(得分:1)
ClassPathXmlApplicationContext本身的实例化创建,自动装配bean并注册监听器等。
对ClassPathXmlApplicationContext(String location)的调用依次在内部调用此方法
/**
* Create a new ClassPathXmlApplicationContext with the given parent,
* loading the definitions from the given XML files.
* @param configLocations array of resource locations
* @param refresh whether to automatically refresh the context,
* loading all bean definitions and creating all singletons.
* Alternatively, call refresh manually after further configuring the context.
* @param parent the parent context
* @throws BeansException if context creation failed
* @see #refresh()
*/
public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
throws BeansException {
super(parent);
setConfigLocations(configLocations);
if (refresh) {
refresh();
}
}
如果bean是原型范围的bean,那么这个调用appContext.getBean("messagebean");
将创建一个新bean,但它有各种其他条件。
答案 1 :(得分:1)
这取决于bean的范围。 需要查看 messagebean 定义。
默认情况下,bean范围是单例,并且将在上下文创建阶段创建此类
np.array([[ 1., 1., np.nan, np.nan],
[ 2., 3., 2., np.nan]])
并在此代码行
ApplicationContext appContext = new ClassPathXmlApplicationContext("Springbeans.xml");
你只是从容器中拿到它。
对于examaple,具有原型范围的bean将按请求创建
更多信息https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-factory-scopes
答案 2 :(得分:1)
ApplicationContext appContext = new ClassPathXmlApplicationContext("Springbeans.xml");
在创建spring容器时,它从XML配置或注释中读取元数据。基于它创建和管理bean生命周期的配置。 bean配置包括它们的范围(单例/原型),默认值等。
MessageBean mBean = (MessageBean)appContext.getBean("messagebean");
这段代码只是询问Spring IoC容器&#34; Hey IoC容器给我的bean名称为messagebean&#34;。
默认情况下,bean的范围是单例,即每个应用程序一个。可以在Springbeans.xml文件中将范围配置为
<beans ...>
<bean id="messagebean" class="com.xyz.spring.MessageBean">
<property name="message" value="hello" scope = "singleton"/>
</bean>
元数据也可以使用注释提供
@Bean
@Scope("singleton")
public MessageBean getMessageBeanSingleton() {
return new MessageBean("hello");
}