现在有一个dao类,我们想在不改变源代码的情况下,实现一个输出方法日志的功能
public interface UserDao {
void add();
void delete();
void update();
void select();
}
public class UserDaoImpl implements UserDao{
@Override
public void add() {
System.out.println("添加了一个用户");
}
@Override
public void delete() {
System.out.println("删除了一个用户");
}
@Override
public void update() {
System.out.println("更新了一个用户");
}
@Override
public void select() {
System.out.println("查询了一个用户");
}
}
我们需要去实现Spring原生的通知接口
这个是被代理方法被调用前的通知
public class Log implements MethodBeforeAdvice {
//o:目标对象,也就是被代理类的对象
@Override
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println(o.getClass()+"调用了【"+method.getName()+"】方法");
}
}
这是方法被调用之后的通知
//AfterReturningAdvice执行完被代理对象方法后执行的方法接口
public class AfterLog implements AfterReturningAdvice {
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
//target:被代理类对象
//returnValue:返回值
System.out.println(target.getClass()+"的"+method.getName()+"被执行完成了。返回结果为:"+returnValue);
}
}
然后我们需要到xml上下文中去配置
<!-- 方式一:使用原生的spring api接口-->
<!-- 配置aop-->
<aop:config>
<!-- 切入点:expression:表达式,execute(要执行的位置)-->
<aop:pointcut id="pointcut" expression="execution(* com.simple1.UserDaoImpl.*(..))"/>
<!-- 执行环绕增加,或者说配置切面,这里配置了两个切面-->
<aop:advisor advice-ref="log" pointcut-ref="pointcut"></aop:advisor>
<aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"></aop:advisor>
</aop:config>