Почему Spring AOP не создает внешние jar-файлы во время выполнения?

У меня есть Java-приложение, построенное на Spring 3. В этом проекте есть еще одна jar-зависимость в качестве зависимости.

Эта зависимость содержит класс @ org.aspectj.lang.annotation.Aspect (скажем, com.aspectprovider.aspects.MyAspect ). Там есть @Before совет сплести метод из классов, реализующий интерфейс Foo . Примерно так:

@Before("execution(* com.project.Foo.save(..))")

Интерфейс Foo может находиться внутри «проекта» или в другом банке. не имеет значения для этого примера.

Мой проект содержит классы, реализующие Foo . Это те классы, которые я хочу, конечно, сплести.

Мой файл конфигурации контекста приложения Spring ( applicationContext.xml ) содержит строку:

<aop:aspectj-autoproxy />

Я также объявляю аспект как bean-компонент и добавляю некоторые свойства:

<bean id="myAspect" class="com.aspectprovider.aspects.MyAspect"
  factory-method="aspectOf" >
  <property name="someproperty" value="somevalue" />
</bean>

Через ведение журнала я вижу, что MyAspect создается, и свойства вводятся. Но метод save не перехватывается. Это проблема.

Если я скопирую классы аспектов из jar-файла в приложение, в котором есть Spring, это сработает. Когда эти аспекты содержатся во внешних jar-файлах, сохранение метода не перехватывается. Есть какие-нибудь подсказки?

edit: как я вызываю метод сохранения Foo:

//in a JSF managed bean
@Inject
private Foo myFoo;  //there's a implementation of Foo in a package that spring is looking at. So it is injected correctly.

public String someAction() {
    myFoo.save("something"); //the @Before advice is only called if the class containing the aspect is not in an external jar
}


//in a class with a main method
void main(String[] ars) {
    ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    //right after the previous line, I can see in the log that MyAspect is instantiated.
    Foo myFoo = ac.getBean(Foo.class);
    myFoo.save("something"); //the @Before advice is only called if the class containing the aspect is not in an external jar
}

По сути, мой applicationContext.xml содержит следующие строки:

<context:annotation-config />
<context:component-scan base-package="com.project" />
<context:component-scan base-package="com.aspectprovider.aspects" />
<aop:aspectj-autoproxy />
<bean id="myAspect" class="com.aspectprovider.aspects.MyAspect" factory-method="aspectOf" >
    <property name="someproperty" value="somevalue" />
</bean>

Я не делаю ' Думаю, мне нужно указать что-нибудь вроде

<context:component-scan  base-package="com.project">
    <context:include-filter type="aspectj" expression="com.aspectprovider.aspects.*" />
</context:component-scan>
7
задан bluefoot 11 May 2011 в 12:29
поделиться