Spring-AOP

2020-02-26  本文已影响0人  煗NUAN

一.AOP介绍

1.简介

2.AOP核心概念

小结

二.创建动态代理

1.动态代理-1

UserService.java

public interface UserService<T>{

      List<T> getUser();
      //获取用户信息
      boolean saveUser(T user);
      //保存用户
      boolean deleteUser(int userId);
      //删除用户信息
      boolean updataUser(T user);
      //更新用户信息
}

UserServiceImpl.java

public class UserServiceImpl implements UserService<Object> {
    @Override
    public List getUser() {
        System.out.println("getUser");
        return new ArrayList();
    }

    @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;
    }
}

Aspect.java

public class Aspect {

    public void before(){
        System.out.println("before");
    }
    public void after(){
        System.out.println("after");
    }
}

UserFactory.java

public class UserFactory {
    public static UserService getUserService(){
        final UserService us=new UserServiceImpl();  //java1.7之后final可以省略不写
        final Aspect aspect=new Aspect();   //在代理方法外添加内容

        //代理对象调用的回调
        UserService userService= (UserService) Proxy.newProxyInstance(UserFactory.class.getClassLoader(), us.getClass().getInterfaces(), new InvocationHandler() {
            //注意:此处需要强转一下

            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //proxy 代理对象 ; method 被代理的方法 ;  args 被代理方法的参数列表

                aspect.before();    //代理方法之前添加的内容

                Object o=method.invoke(us,args);
                //invoke方法:public Object invoke(Object obj, Object... args){}

                aspect.after();     //代理方法之后添加的内容

                return o;
            }
        });
        return userService;  //方法的返回值
    }
}

单元测试

public class AOPTest1 {
    @Test
    public void userService(){

        //代理方法外添加的内容看不到
        UserService us=new UserServiceImpl();

        System.out.println(us.getUser());
        System.out.println(us.saveUser(new Object()));
        System.out.println(us.deleteUser(2));
        System.out.println(us.updataUser(new Object()));

        System.out.println("-------------分隔符-------------");

        //代理方法外添加的内容可以看到
        UserService us1=UserFactory.getUserService();
        System.out.println(us1.getUser());
        System.out.println(us1.saveUser(new Object()));
        System.out.println(us1.deleteUser(2));
        System.out.println(us1.updataUser(new Object()));
    }
}

2.动态代理-2

接口UserService.java ; Aspect.java ; UserServiceImpl.java代码同上

public class UserFactory {
    public static UserService getUserService(){

        final UserService us=new UserServiceImpl();
        final Aspect aspect=new Aspect();

        Enhancer enhancer=new Enhancer(); //创建Enhancer对象
        enhancer.setSuperclass(UserService.class);  //设置增强类Enhancer的superClass

        //设置Enhancer对象的回调
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                aspect.before();

                Object obj=method.invoke(us,objects);
                aspect.after();
                return obj;
            }
        });

        UserService<Object> userService= (UserService<Object>) enhancer.create();
        //通过 enhancer对象的create()方法来得到指定对象
        return userService;
    }
}

三.动态代理-3

接口UserService.java代码同上

public class UserServiceImpl implements UserService {

    ApplicationContext ac;

    @Override
    public List getUser() {
        System.out.println("获取用户信息");
        return null;
    }

    @Override
    public boolean saveUser(Object user) {
        System.out.println("注册用户");
        return false;
    }

    @Override
    public boolean deleteUser(int userId) {
        System.out.println("删除用户");
        return false;
    }

    @Override
    public boolean updataUser(Object user) {
        System.out.println("更新用户");
        return false;
    }
}
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 obj=methodInvocation.proceed();
        after();
        return obj;
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="us" class="com.aop.aop3.UserServiceImpl" />
    <bean id="aspect" class="com.aop.aop3.Aspect" />

    <bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="interfaces" value="com.aop.aop3.UserService" />
        <property name="target" ref="us" />
        <property name="interceptorNames" value="aspect" />
        <property name="optimize" value="true" />
    </bean>
</beans>
public class AOPTest3 {
    @Test
    public void userService(){

        ApplicationContext ac=new ClassPathXmlApplicationContext("com/aop/aop3/beans.xml");

        UserService us=ac.getBean("proxy", UserService.class);

        Object o=new Object();

        System.out.println(us.getUser());
        System.out.println(us.saveUser(new Object()));
        System.out.println(us.deleteUser(2));
        System.out.println(us.updataUser(new Object()));
    }
}
上一篇 下一篇

猜你喜欢

热点阅读