SpringAOP实现代理-4 ( AOP config形式)
- 定义切面类 Aspect.java
- 实现一个通知类型,实现MethodInterceptor接口,重写里面的invoke方法,通过参数调用proceed()执行目标类,在前后写代码
public class Aspect implements MethodInterceptor {
public void before(){
System.out.println("before");
}
public void after(){
System.out.println("after");
}
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
before();
Object o=methodInvocation.proceed();
after();
return o;
}
}
- 目标类UserServiceImpl.java已实现接口
public class UserServiceImpl implements UserService {
@Override
public List getUser() {
System.out.println("getUser");
return null;
}
@Override
public boolean saveUser(Object user) {
System.out.println("saveUser");
return false;
}
@Override
public boolean deleteUser(int userId) {
System.out.println("deleteUser");
return false;
}
@Override
public boolean updataUser(Object user) {
System.out.println("updataUser");
return false;
}
}
-
自动代理beans.xml配置
-
步骤
- 配置切面类的Bean实例
- 配置目标类的Bean实例
- 配置切入点(结合exeution表达式)
- 配置切面(切入点和通知/加强点)
-
需要beans标签中添加属性
xmlns:aop="http://www.springframework.org/schema/aop" http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
-
<?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">
<!--创建目标类的实现-->
<bean id="us" class="com.aop.aop4.UserServiceImpl" />
<!--创建切面类-->
<bean id="asp" class="com.aop.aop4.Aspect" />
<!--proxy-target-class的属性设置成true,强制使用cglib方式实现代理对象-->
<aop:config proxy-target-class="true">
<!--
pointcut:切点
"execution(* com.aop.aop4.*.*(..))"
a:第一个*是指所有的返回值,可以改成boolean,java.util.List等,若是改成boolean,则说明只有返回值是boolean的被代理
b:第二个*是指所有的类,可以根据要求修改,例如:com.aop.aop4.UserServiceImpl
c:第三个*是指类中所有的方法 例:deleteUser UserServiceImpl中的删除方法
d:(..)是指任意参数
如:java.util.List com.aop.aop4.UserServiceImpl.deleteUser(int);指UserServiceImpl中的deleteUser方法,且参数是int型,返回值是list集合才会被代理
-->
<aop:pointcut id="pt" expression="execution(* com.aop.aop4.*.*(..))"/>
<!--通知,将代理内容Aspect与切点关联起来-->
<aop:advisor advice-ref="asp" pointcut-ref="pt" />
</aop:config>
</beans>
- 单元测试
public class AOPTest4 {
@Test
public void userService(){
ApplicationContext ac=new ClassPathXmlApplicationContext("aop4/beans.xml");
UserService userService=ac.getBean("us",UserService.class);
userService.getUser();
userService.saveUser(new Object());
userService.deleteUser(2);
userService.updataUser(new Object());
}
}
网友评论