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吗?
有了@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语句和可能的其他依赖项之后).
| 归档时间: |
|
| 查看次数: |
3218 次 |
| 最近记录: |