Spring AOP Proxy, который не - PullRequest
       26

Spring AOP Proxy, который не

3 голосов
/ 20 ноября 2008

У меня установлено два прокси Spring:

  <bean id="simpleBean" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="target">
        <ref local="simpleBeanTarget"/>
    </property>
    <property name="interceptorNames">
        <list>
            <value>cacheInterceptor</value>
        </list>
    </property>
</bean>   



 <bean id="springDao" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="target" ref="springDaoTarget"/>
        <property name="interceptorNames">
            <list>
                <value>daoInterceptor</value>
            </list>
        </property>

    </bean>

simpleBean работает просто отлично, SpringDao - нет.

Класс SpringDao выглядит так:

public class SpringDao extends JdbcDaoSupport {

private SimpleJdbcTemplate simpleJdbcTemplate;

public SimpleJdbcTemplate getSimpleJdbcTemplate() {

    if (simpleJdbcTemplate==null) {
        simpleJdbcTemplate= new SimpleJdbcTemplate(getDataSource());
    }
    return simpleJdbcTemplate;
}
    ...

И мой тестовый модуль автоматически подключен так:

@Autowired
@Qualifier("springDao")
protected SpringDao springDao;

И первое указание на то, что что-то не так, - это ошибка:

Не удалось автоматически связать поле:. , , вложенными исключение java.lang.IllegalArgumentException

Если я закомментирую аннотацию @Qualifier и снова выполню мой модульный тест, я получу следующее:

Нет уникального бина типа ... ожидается один соответствующий боб, но найден 2: [springDaoTarget, springDao]

Это то, что я ожидал.

Итак, я изменил свою автопроводку на

@Autowired
@Qualifier("springDaoTarget")
protected SpringCustomerCapacityDao springDao;

И добавил следующее в мой юнит-тест:

        Object proxy = applicationContext.getBean("springDao");

    Assert.assertNotNull(proxy);
    Assert.assertTrue(proxy instanceof SpringDao);

И тест экземпляра не пройден, что (для меня) означает, что мой прокси-сервер на самом деле не является моим прокси.

Так что я в замешательстве. В чем дело? Как я могу это исправить?

Редактировать Вот запрошенное определение springDaoTarget, которое разочарует многих:

<bean id="springDaoTarget" class="com.company.SpringDao">

Ответы [ 2 ]

9 голосов
/ 29 ноября 2008

Если цель вашего прокси-сервера реализует хотя бы один интерфейс, то поведение Spring по умолчанию заключается в создании прокси-сервера JDK, который реализует все интерфейсы цели. Это означает, что он не будет подклассом целевого класса. Вы можете переопределить это, принудительно создавая прокси-серверы CGLIB, которые являются динамическими подклассами цели.

Как правило, если вы собираетесь использовать AOP, но используете интерфейсы только ограниченным образом, вы захотите использовать CGLIB. В противном случае в вашем контейнере будет много прокси-серверов JDK, которые не соответствуют типу загруженных реализаций бина.

См. Блог Cliff Meyers: Spring AOP: динамические прокси CGLIB или JDK?

1 голос
/ 24 ноября 2008

Это было легко исправить, как только я понял это. SpringDao больше не наследуется от JdbcDaoSupport и теперь работает.

...