Spring AOP:没有触发建议

ser*_*nni 2 aop spring spring-aop

试图设计简单的方面,当任何公共方法执行时,将"logg"字打印到控制台.

方面:

@Aspect
public class LoggingAspect {

    @Pointcut("execution(public * *(..))")
    public void publicServices() {
    };

    @Before("publicServices()")
    public void logg() {
        System.out.println("logg");
    }

}
Run Code Online (Sandbox Code Playgroud)

xml配置:

    <context:component-scan base-package="aspectlogging" /> 
    <aop:aspectj-autoproxy/>
    <bean id="loggingAspectHolder" class="aspectlogging.LoggingAspect"/>
Run Code Online (Sandbox Code Playgroud)

简单的豆子:

package aspectlogging;
@Component
    public class TestableBean {

        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
        }
Run Code Online (Sandbox Code Playgroud)

测试:

public class TestLogging {
    public static void main(String[] args) {
        TestableBean tb = new TestableBean();
        tb.setName("yes");
        tb.getName();
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望,运行结果TestLogging将是控制台中的" logg "字,并且不返回任何输出.在这种情况下,我能正确理解AOP吗?

Don*_*ows 5

有了@Around建议,你需要有一个ProceedingJoinPoint pjp建议方法的参数,并pjp.proceed()在你希望调用包装方法时调用顾问程序中的点.@Before真的很容易使用建议,当你所做的事情将会正常工作.


[编辑]:另外,你必须让Spring为你构建你的bean,而不是直接调用new.这是因为bean对象实际上是真实对象(位于其中)的代理.因为您的目标对象没有实现接口,所以除了Spring库之外,还需要在类路径上使用cglib库.(或者,您可以完全使用AspectJ,但这需要使用不同的编译器配置.)

要创建bean,首先需要创建一个Spring 上下文,然后查询bean实例.这意味着您可以从:

TestableBean tb = new TestableBean();
Run Code Online (Sandbox Code Playgroud)

要(假设您正在使用Spring 3,并且您的XML配置位于类路径上的某个"config.xml"中):

ApplicationContext context = new ClassPathXmlApplicationContext("config.xml");
TestableBean tb = context.getBean(TestableBean.class);
Run Code Online (Sandbox Code Playgroud)

其余代码保持不变(在调整import语句和可能的其他依赖项之后).