Spring 休眠 + AOP

Spring Hibernate + AOP

求助!我正在使用 Spring+Hibernate,我正在尝试像这样使用 AOP :

package ua.i.pustovalov.table;
enter code here

@Aspect
public class Aoprad {

    @Pointcut("execution(* *getAll(..))")
    public void performance() {
    }

    public Aoprad() {

    }

    @Around("performance()")
    public void AfterAndPriv(ProceedingJoinPoint joinPoint) {
    try {

        System.out.println("Open query");
        joinPoint.proceed();
        System.out.println("Close query");
    } catch (Throwable e) {
        e.printStackTrace();
    }

    }

}

当我尝试使用我的方法时,它 returns 无效。

public class TestDao {

public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
    new String[] { "applicationContext.xml" }, true);

DaoInterface das = (DaoInterface) context.getBean("dataDao");

System.out.println(das.getAll());

}

<context:annotation-config />

<aop:aspectj-autoproxy />
<context:component-scan base-package="ua.i.pustovalov.*">
</context:component-scan>





<bean id="audience" class="ua.i.pustovalov.table.Aoprad" />


<aop:config>
    <aop:pointcut id="myPointcut"
        expression="execution(* ua.i.pustovalov.maven.*.*(..))" />
    <aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut" />
</aop:config>



<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <!-- <tx:method name="get*" propagation="REQUIRED" read-only="true" /> -->
        <tx:method name="getAll*" propagation="REQUIRED" read-only="true" />

    </tx:attributes>
</tx:advice>
<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName">
        <value>com.mysql.jdbc.Driver</value>
    </property>
    <property name="url">
        <value>jdbc:mysql://localhost:3306/homebase</value>
    </property>
    <property name="username">
        <value>root</value>
    </property>
    <property name="password">
        <value></value>
    </property>
</bean>

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="classpath:/hibernate.cfg.xml" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.current_session_context_class">thread</prop>
            <!-- <prop key="hibernate.hbm2ddl.auto">create</prop> -->
        </props>
    </property>
</bean>

<bean id="dataDao" class="ua.i.putsovalov.dao.DaoStudent">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

我的 DAO class

package ua.i.putsovalov.dao;

public class DaoStudent extends HibernateDaoSupport implements DaoInterface {

public DaoStudent() {
}

@Override
protected HibernateTemplate createHibernateTemplate(
    SessionFactory sessionFactory) {
HibernateTemplate result = super
    .createHibernateTemplate(sessionFactory);
result.setAllowCreate(true);
return result;
}

@Override
public Student get(int id) {

return (Student) getSession().get(Student.class, id);
}

@Override
public Student get(String text) {
return (Student) getSession().get(Student.class, text);
}

@SuppressWarnings("unchecked")
@Override
public Collection<Student> getAll() {
return getSession().createCriteria(Student.class).list();
}

}

和界面

public interface DaoInterface {

Student get(int id);

Student get(String text);

Collection<Student> getAll();
}

我可以采取哪些步骤来调试此问题?

使用环绕方面时,您应该始终使用 return 是 Object 而不是 void 的方法签名,并且您应该始终 return 调用的结果proceed() 方法。如果您不这样做,这方面建议的每个方法都将 return 为空,因为没有任何 returned。

@Around("performance()")
public Object AfterAndPriv(ProceedingJoinPoint joinPoint) {
try {
    System.out.println("Open query");
    return joinPoint.proceed();
} catch (Throwable e) {
    e.printStackTrace();
} finally {
    System.out.println("Close query");
}
}