2015-02-05 2 views
1

docs говорит:весной XML-определение на основе боба, атрибут класса `bean` элемента

"The class attribute defines the type of the bean and uses the fully qualified classname. " 

You use the Class property in one of two ways: 

Typically, to specify the bean class to be constructed in the case where the container itself directly creates the bean by calling its constructor reflectively, somewhat equivalent to Java code using the new operator. 
To specify the actual class containing the static factory method that will be invoked to create the object, in the less common case where the container invokes a static factory method on a class to create the bean. The object type returned from the invocation of the static factory method may be the same class or another class entirely. 

Так как объяснить этот случай:

1) весна боба определения XML classattribute.xml :

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
    <property name="user" value="${jdbc.username}"></property> 
    <property name="password" value="${jdbc.password}"></property> 
    <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property> 
    <property name="driverClass" value="${jdbc.driverClass}"></property> 
    <property name="minPoolSize" value="${connpool.minSize}"></property> 
    <property name="maxPoolSize" value="${connpool.maxSize}"></property> 
</bean> 

<!-- EntityManagerFactory --> 
<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource"></property> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
    </property> 
    <property name="packagesToScan" value="${entity.package}"></property> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.show_sql">true</prop> 
      <!-- other props --> 
     </props> 
    </property> 
</bean> 

2) тест:

import javax.persistence.EntityManagerFactory; 
//... 

private ApplicationContext ctx; 

@Test 
public void test(){ 
    Object bean = ctx.getBean("entityManagerFactory"); 
    System.out.println(bean.getClass()); 
    System.out.println(bean instanceof EntityManagerFactory); 
    System.out.println(new LocalContainerEntityManagerFactoryBean() instanceof EntityManagerFactory); 
    System.out.println(new LocalContainerEntityManagerFactoryBean().getClass() == bean.getClass()); 
} 


@Before 
public void setUp() { 
    ctx = new ClassPathXmlApplicationContext("classattribute.xml"); 
} 

3) Результат:

class $Proxy14 
true 
false 
false 

4) Я не думаю, что classattribute.xml конкретизирует боб entityManagerFactory со статическим фабричным методом, так как factory-method attribut элемента '' не указывается.

5) Может ли кто-нибудь объяснить это? Заранее спасибо!

ответ

2

Ваш боб

<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 

Тип LocalContainerEntityManagerFactoryBean является FactoryBean<EntityManagerFactory>. Это особый тип весной.

Интерфейс быть реализован объектами, используемых в BeanFactory какой сами заводы. Если bean реализует этот интерфейс, это , используемый в качестве фабрики для объекта для экспонирования, а не непосредственно как фасоль экземпляр, который будет выставлен сам.

Так Spring использует LocalContainerEntityManagerFactoryBean объект со свойствами, которые вы установили, чтобы сгенерировать EntityManagerFactory объект, который он выставляет как боб с name вы предоставили. Таким образом, компонент, который вы определили, имеет тип EntityManagerFactory, а не LocalContainerEntityManagerFactoryBean.

Об этом далее говорится в документации, here. Как говорится, вы можете получить объект LocalContainerEntityManagerFactoryBean.

Когда вам нужно задать контейнер для фактического FactoryBean экземпляра самих вместо боба он производит, предварить идентификатор бин с символом амперсанда (&) при вызове getBean() метода ApplicationContext.

Смежные вопросы