получить проксированный экземпляр из весны - PullRequest
0 голосов
/ 11 сентября 2009

Я заинтересован в том, чтобы класс был прокси с весны, а не с прокси.

е:

public class FooImpl<KittyKat> {

    @Transactional
    public void doStuff() {
        getBar();
        // java.lang.ClassCastException: $Proxy26 cannot be cast to 
        // com.my.foo.Bar   
    }   

}

public abstract class AbstractFoo<T extends AbstractBar> {

    public String barBeanName;

    protected T getBar() {
        // java.lang.ClassCastException: $Proxy26 cannot be cast to 
        // com.my.foo.Bar
    return (T)appContext.getBean(barBeanName);
    }
}  

public class KittyCat extends AbstractBar {
 ...
}

public abstract class AbstractBar {
  ...
}

1 Ответ

1 голос
/ 11 сентября 2009

Вы пытаетесь получить прокси-компонент только из-за ClassCastException? Если бы вы могли сыграть на Bar, были бы вы довольны этим?

Когда Spring создает прокси, он проверяет, реализует ли класс бина какие-либо интерфейсы. Если это так, то сгенерированный прокси также будет реализовывать эти интерфейсы, но не будет расширять класс целевого компонента. Это делается с использованием стандарта java.lang.reflect.Proxy. Это похоже на ваш пример.

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

Вы можете заставить Spring всегда проксировать целевой класс, но то, как вы это сделаете, зависит от того, как вы создали прокси Bar для начала, и вы не сказали нам этого.

Обычно предпочтительным решением является обращение к прокси-компонентам по их интерфейсам, и все работает хорошо. Если ваш класс Bar реализует интерфейсы, может ли Foo не ссылаться на этот интерфейс?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...