Java 基于spring xml的bean定义,`bean`元素的class属性

Java 基于spring xml的bean定义,`bean`元素的class属性,java,xml,spring,jpa,Java,Xml,Spring,Jpa,说: 那么如何解释这个案例呢 1) Springbean定义XMLclassattribute.XML: 3) 结果是: class $Proxy14 true false false 4) 我不认为classattribute.xml用静态工厂方法实例化beanentityManagerFactory,因为没有指定“”元素的工厂方法属性 5) 有人能解释一下吗?提前谢谢 你的豆子是 <bean id="entityManagerFactory" class="org.spr

说:


那么如何解释这个案例呢

1) Springbean定义XML
classattribute.XML

3) 结果是:

class $Proxy14
true
false
false
4) 我不认为
classattribute.xml
用静态工厂方法实例化bean
entityManagerFactory
,因为没有指定“”元素的
工厂方法
属性

5) 有人能解释一下吗?提前谢谢

你的豆子是

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

类型是a。这是春天的一种特殊类型

BeanFactory中使用的对象实现的接口
他们自己就是工厂如果bean实现了这个接口,那么
用作对象公开的工厂,而不是直接用作bean
实例自身将被公开。

因此Spring使用一个具有您设置的属性的对象来生成一个
EntityManagerFactory
对象,该对象以您提供的
名称
作为bean公开。因此,您定义的bean实际上是
EntityManagerFactory
类型,而不是
LocalContainerEntityManagerFactoryBean

这将在文档中进一步讨论。如图所示,您可以获得
LocalContainerEntityManagerFactoryBean
对象

当您需要向容器请求实际的
FactoryBean
实例时 在bean的id前面加上 调用
ApplicationContext

<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>
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");
}
class $Proxy14
true
false
false
<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">