注解
声明一个切点(注解)
@Component//相当于XML中的<bean>
public class EatLemon implements Eat {
/**
* 通过@Pointcut注解定义切入点表达式
*/
@Pointcut("execution(* com.lanou3g.spring.eat.EatLemon.*(..))")
public String eat() {
String dd ="吃了柠檬,我酸了";
System.out.println(dd);
return dd;
}
声明一个切面和通知(注解)
@Aspect//定义一个切面
@Component
public class First {
//指定该方法是一个环绕通知,通知注解的参数代表引用一个切入点表达式
@Around("execution(* com.lanou3g.spring.eat.EatLemon.*(..))")
public void look(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("看见某些东西");
//调用目标方法
Object retVal = joinPoint.proceed();
System.out.println("你呢");
}
}
入口类(注解)
/**
* 入口类
*/
//相当于Xml中的<beans>
@Configuration
//扫描路径下的注解
@ComponentScan( basePackages = "com.lanou3g.spring.eat")
//开启对AOP相关注解的处理
@EnableAspectJAutoProxy
public class AppByAnnotation {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppByAnnotation.class);
Eat el = ctx.getBean(Eat.class);
el.eat();
}
}
控制台输出结果(注解)
XML
现在XML中定义目标类
<!-- 原本要执行的代码-->
<bean id="eat" class="com.lanou3g.spring.eat.EatLemon"/>
定义一个切面类
<!-- 切面类-->
<bean id="aspect" class="com.lanou3g.spring.eat.First"/>
定义切点和通知
<!-- 切面类-->
<bean id="aspect" class="com.lanou3g.spring.eat.First"/>
<aop:config>
<aop:pointcut id="first" expression="execution(* com.lanou3g.spring.eat.EatLemon.*(..))"/>
<aop:aspect ref="aspect">
<!-- 环绕通知可以终止目标方法,环绕通知目标方法前后做事的通知 -->
<aop:around method="look" pointcut-ref="first"/>
</aop:aspect>
</aop:config>
入口类(xml)
/**
* XML
*/
public class App {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Eat el = ctx.getBean(Eat.class);
el.eat();
}
}