Spring AOP实例
AOP的一些概念:
切入点(Pointcut),在哪些类哪些方法上切入;
通知(Advice),在方法执行的什么实际(when:方法前/方法后/方法前后)做什么(what:增强的功能)
切面(Aspect),切面 = 切入点 + 通知,通俗点就是:在什么时机,什么地方,做什么增强!
织入(Weaving),把切面加入到对象,并创建出代理对象的过程。(由 Spring 来完成)
继续前文https://blog.csdn.net/qq_36328413/article/details/100176180
1.在 Packge【aspect】下准备日志切面 【LoggerAspect】类:
package aspect;
import org.aspectj.lang.ProceedingJoinPoint;
public class LoggerAspect{
public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
//方法前
System.out.println("start log:" + joinPoint.getSignature().getName());
Object object = joinPoint.proceed();
//方法后
System.out.println("end log:" + joinPoint.getSignature().getName());
return object;
}
}
2.在 xml 文件中声明业务对象和日志切面:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean name="produceService" class="service.ProduceService" />
<bean id="loggerAspect" class="aspect.LoggerAspect"/>
<bean name="source" class="pojo.Source">
<property name="fruit" value="橙子"/>
<property name="sugar" value="多糖"/>
<property name="size" value="超大杯"/>
</bean>
<bean name="juiceMaker" class="pojo.juiceMaker">
<property name="source" ref="source" />
</bean>
<!-- 配置AOP -->
<aop:config>
<!-- where:在哪些地方(包.类.方法)做增加 -->
<aop:pointcut id="loggerCutpoint"
expression="execution(* pojo.juiceMaker.*(..)) "/>
<!-- what:做什么增强 -->
<aop:aspect id="logAspect" ref="loggerAspect">
<!-- when:在什么时机(方法前/后/前后) -->
<aop:around pointcut-ref="loggerCutpoint" method="log"/>
</aop:aspect>
</aop:config>
</beans>
3.创建测试类testaop
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import pojo.Source;
import pojo.juiceMaker;
import service.ProduceService;
public class testaop {
@SuppressWarnings("resource")
public static void main(String args[]){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext2.xml");
Source source=(Source)context.getBean("source");
System.out.println(source.getFruit());
System.out.println(source.getSugar());
System.out.println(source.getSize());
juiceMaker juiceMaker=(juiceMaker)context.getBean("juiceMaker");
juiceMaker.makeJuice();
}
}
4.输出结果如下