美文网首页
SpringAOP-2

SpringAOP-2

作者: 煗NUAN | 来源:发表于2020-02-27 23:11 被阅读0次

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());
    }
}

相关文章

  • SpringAOP-2

    SpringAOP实现代理-4 ( AOP config形式) 定义切面类 Aspect.java实现一个通知类...

网友评论

      本文标题:SpringAOP-2

      本文链接:https://www.haomeiwen.com/subject/zgifhhtx.html