类的实例化 - Spring框架

时间:2018-01-04 18:10:44

标签: java spring

在下面的代码中,

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())是否实例化?

3 个答案:

答案 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");
}