切面
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class MyAspect implements MethodInterceptor{
@Override
public Object invoke(MethodInvocation mi) throws Throwable {
System.out.println("前");
// 手动执行目标方法
Object obj = mi.proceed();
System.out.println("后");
return obj;
}
}
接口
public interface UserService {
void addUser();
void updateUser();
}
实现类
public class UserServiceImpl implements UserService {
@Override
public void addUser() {
System.out.println("config adduser...");
}
@Override
public void updateUser() {
System.out.println("config updateUser...");
}
}
配置文件
<?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"
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">
<!-- 1.创建目标类 -->
<bean id="userService" class="com.atchina.c_spring_aop.UserServiceImpl"/>
<!-- 2.创建切面类 -->
<bean id="myAspect" class="com.atchina.c_spring_aop.MyAspect"/>
<!-- 3. aop编程
使用<aop:config>配置
<aop:pointcut> 切入点
<aop:advisor>特殊的切面
advice-ref="" 通知的引用
pointcut-ref="" 切入点的引用
expression="" 切入点表达式
-->
<aop:config>
<aop:pointcut expression="execution(* *.*(..))" id="myPointCut"/>
<aop:advisor advice-ref="myAspect" pointcut-ref="myPointCut" />
</aop:config>
</beans>
测试类:
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestFactoryBean {
@Test
public void test(){
String xmlPath = "com/atchina/c_spring_aop/applicationContext.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(xmlPath);
UserService userService = (UserService)ac.getBean("userService");
userService.addUser();
}
}