没有任何用处的PersistenceAnnotationBeanPostProcessor呢?(Is

2019-07-31 16:35发布

据其JavaDoc中,PersistenceAnnotationBeanPostProcessor似乎是负责与注解@PersistenceContext注入EntityManager的。 看来没有这个bean在Spring应用程序上下文XML声明暗示,该@PersistenceContext注释将无法正常工作。

但是,根据我的实验,这不是事实。

persistence.xml中

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
        http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
    version="1.0">
    <persistence-unit name="default" transaction-type="RESOURCE_LOCAL" />
</persistence>

Spring应用程序上下文XML

<context:component-scan base-package="com.test.dao" />

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="persistenceUnitName" value="default"/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="true"/>
            <property name="generateDdl" value="true"/>
            <property name="databasePlatform" value="org.hibernate.dialect.DerbyDialect"/>
        </bean>
    </property>
</bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.apache.derby.jdbc.ClientDriver"/>
    <property name="url" value="jdbc:derby://localhost:1527/c:\derbydb\mydb"/>
    <property name="username" value="APP"/>
    <property name="password" value="APP"/>
</bean>

<tx:annotation-driven/>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<!-- 
    <bean id="persistenceAnnotation" class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
 -->

在UserDAOImpl

@Repository("userDao")
public class UserDaoImpl implements UserDao {

    @PersistenceContext
    protected EntityManager entityManager;

    @Transactional
    public void save(User user) {
            entityManager.persist(user);
    }
}

无论我评论或取消对persistenceAnnotation豆,结果是一样的。 它不会伤害到周围离开豆,但有什么用这个bean的?

我使用Spring 3.0.5。

可能有人在那里取出这个bean将导致无法提供的情况?

另外我不喜欢创建一个空的持久性单元,只是愚弄春天。 幸运的是,这个问题已经在Spring 3.1.0得到解决。

Answer 1:

所述PersistenceAnnotationBeanPostProcessor透明地激活<context:component-scan />元件。 要精确它的<context:annotation-config />元素,通过激活豆但反过来这元件被激活透明<context:component-scan />



Answer 2:

如奥利弗基尔克提到的, org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor自动由Spring使用基于注解配置在被加载到应用语境。 它的一个职责就是寻找合适的实体EntityManagerFactory会提供EntityManager@PersistenceContext注解属性。

如果你有多个EntityManagerFactory豆在你的Spring配置/背景和你有@PersistenceContext没有注解unitName属性(比方说,你正在使用带有这样的bean创建一个框架,你不能碰框架代码),您可以运行这个例外: org.springframework.beans.factory.NoUniqueBeanDefinitionException

我发现这个解决办法的情况下,你囤到这一点:

<bean id="org.springframework.context.annotation.internalPersistenceAnnotationProcessor"
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" >
<property name="defaultPersistenceUnitName" value="entityManagerFactory"/>
</bean> 

这将覆盖默认PersistenceAnnotationBeanPostProcessor由Spring用新的被装载defaultPersistenceUnitName



文章来源: Is PersistenceAnnotationBeanPostProcessor of any use at all?