AOP
①提前准备
UserService接口
package com.lichengxun.service;
public interface UserService {
public void add();
public void delete();
public void update();
public void select();
}
UserServiceImpl类
package com.lichengxun.service;
public class UserServiceImpl implements UserService{
public void add() {
System.out.println("执行了add方法");
}
public void delete() {
System.out.println("执行了delete方法");
}
public void update() {
System.out.println("执行了update方法");
}
public void select() {
System.out.println("执行了select方法");
}
}
②创建log包【方法一】
在其包中创建两个AfterLog和BeforeLog类
import java.lang.reflect.Method;
public class BeforeLog implements MethodBeforeAdvice {
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println("[Debug]"+o.getClass().getName()+"执行了"+method.getName());
}
}
package com.lichengxun.log;
import org.springframework.aop.AfterAdvice;
import org.springframework.aop.AfterReturningAdvice;
import java.lang.reflect.Method;
public class AfterLog implements AfterReturningAdvice {
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println("[Debug]日志调用了"+method.getName()+"方法");
}
}
【注意点】BeforeLog类需要实现MethodBeforeAdvice接口,AfterLog类需要实现AfterReturningAdvice 接口
③resource目录下创建applicationContext.xml
先在applicationContext.xml中进行注册上面的类的bean
<!--注册bean-->
<bean id="serviceImpl" class="com.lichengxun.service.UserServiceImpl"/>
<bean id="log" class="com.lichengxun.log.log"/>
<bean id="afterLog" class="com.lichengxun.log.AfterLog"/>
<!--方式一:使用原生Spring API接口-->
<!--配置aop:需要导入aop的约束-->
<!--<aop:config>
<!–切入点:expression:表达式,execution(要执行的位置!)–>
<aop:pointcut id="pointcut" expression="execution(* com.lichengxun.service.UserServiceImpl.*(..))"/>
<!–执行环绕增加!–>
<aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/>
</aop:config>-->
②创建diy包【方法二:ZI自定义】
在其包中创建一个diy类
public class diy {
public void Before(){
System.out.println("[Debug]===================方法执行前===================");
}
public void After(){
System.out.println("[Debug]===================方法执行后===================");
}
}
③在resource目录下中的applicationContext.xml中需要注册diy的bean
<bean id="diy" class="com.lichengxun.Diy.diy"/>
<!--方式二:自定义类-->
<!--<aop:config>
<!–自定义切面,ref要引用的类–>
<aop:aspect ref="diy">
<!–切入点–>
<aop:pointcut id="point" expression="execution(* com.lichengxun.service.UserServiceImpl.*(..))"/>
<!–通知–>
<aop:before method="Before" pointcut-ref="point"/>
<aop:after method="After" pointcut-ref="point"/>
</aop:aspect>
</aop:config>-->
②在log包下创建annotation类【方法三:注解】
@Aspect
public class annotation {
@Before("execution(* com.lichengxun.service.UserServiceImpl.*(..))")
public void before(){
System.out.println("[Debug]===============方法执行前===============");
}
@After("execution(* com.lichengxun.service.UserServiceImpl.*(..))")
public void after(){
System.out.println("[Debug]===============方法执行后===============");
}
//在环绕增强中,我们可以给定一个参数,代表我们要获取处理切入的点。
@Around("execution(* com.lichengxun.service.UserServiceImpl.*(..))")
public void arround(ProceedingJoinPoint jp) throws Throwable {
System.out.println("环绕前");
//执行方法
Object proceed = jp.proceed();
System.out.println("环绕后");
Signature signature = jp.getSignature();
System.out.println(signature);
}
}
③在resource目录下中的applicationContext.xml中配置相关注解操作
<!--方式三-->
<bean id="ancut" class="com.lichengxun.Diy.annotationPointcut"/>
<!--开启注解支持! JDK(默认 proxy-target-class="false") cglib(roxy-target-class="true")-->
<aop:aspectj-autoproxy proxy-target-class="false"/>
④测试类
import com.lichengxun.service.UserService;
import com.lichengxun.service.UserServiceImpl;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestMy {
@Test
public void TestLOG(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//【注意点】动态代理的是接口
UserService userImpl = context.getBean("serviceImpl", UserService.class);
userImpl.add();
}
}