SpringAOP的实现(七)

  • IUserService
package com.qfedu.aop07;

import java.util.List;

/**
 * Created by HuangCong on 2020/2/26.
 */
public interface IUserService {

    List<Object> getAllUser();

    boolean saveUser(Object user);

    boolean deleteUser(int uid);

    boolean updateUser(Object obj);
}

  • UserServiceImpl实现类:
package com.qfedu.aop07;


import org.springframework.stereotype.Component;

import java.util.List;

/**
 * Created by HuangCong on 2020/2/26.
 */
@Component("us")
public class UserServiceImpl implements IUserService {
    @Override
    public List<Object> getAllUser() {
        System.out.println("------getAllUser------");
        return null;
    }

    @Override
    public boolean saveUser(Object user) {
        System.out.println("------saveUser------");
        return false;
    }

    @Override
    public boolean deleteUser(int uid) {
        System.out.println("------deleteUser------");
        return false;
    }

    @Override
    public boolean updateUser(Object obj) {
        System.out.println("------updateUser------");
//        System.out.println(1 / 0);
        return false;
    }
}

  • MyAspect:切面类
package com.qfedu.aop07;

/**
 * Created by HuangCong on 2020/2/28.
 */
public class MyAspect {
    public void before() {
        System.out.println("=========Before=========");
    }

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

  • UserServiceImpl2
package com.qfedu.aop07;

import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Component("us2")
public class UserServiceImpl2 implements IUserService {

    @Override
    public List<Object> getAllUser() {
        System.out.println("--------getAllUser----------");
        return new ArrayList<>();
    }

    @Override
    public boolean saveUser(Object user) {
        System.out.println("--------saveUser----------");
        return true;
    }

    @Override
    public boolean deleteUser(int uid) {
        System.out.println("--------deleteUser----------");
        return false;
    }

    @Override
    public boolean updateUser(Object obj) {
        System.out.println("--------updateUser----------");
        return true;
    }
}

  • MyBeanPostProcessor类
package com.qfedu.aop07;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.cglib.proxy.InvocationHandler;
import org.springframework.cglib.proxy.Proxy;
import org.springframework.lang.Nullable;

import java.lang.reflect.Method;

/**
 * 配置了包扫描之后,该类会初始化两个对象EventListenerMethodProcessor和DefaultEventListenerFactory,再外加我们自己的组件对象
 * 所以会发现有一个before和一个after打印
 * 我还专门加了一个UserServiceImpl2,你会发现将有二个before和二个after的打印(注意看看该类上的Component注解是否启用)
 */
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Nullable
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("=======Before======" + bean);
        return bean;
    }

    @Nullable
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("========After======" + bean);

        return Proxy.newProxyInstance(MyBeanPostProcessor.class.getClassLoader(), bean.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                MyAspect ma = new MyAspect();

                ma.before();
                Object obj = method.invoke(bean, objects);
                ma.after();

                return obj;
            }
        });
    }
}

  • beans_aop07.xml:XML文件配置
<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

    <!--
        context:component-scan上下文的组件扫描
            base-package指定要扫描的包为com.qfedu.aop07
    -->
    <context:component-scan base-package="com.qfedu.aop07"/>

    <!--
       指定BeanPostProcessor的Factory hook,让每个bean对象初始化是自动回调该对象中的回调方法
    -->
    <bean class="com.qfedu.aop07.MyBeanPostProcessor"/>
</beans>
  • TestAOP07
package com.qfedu.aop07;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created by HuangCong on 2020/2/28.
 */
public class TestAOP07 {
    @Test
    public void testAOP06() {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans_aop07.xml");
        IUserService us = context.getBean("us", IUserService.class);

        Object obj = new Object();
        us.getAllUser();
        us.saveUser(obj);
        us.deleteUser(1);
        us.updateUser(obj);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是聪聪黄吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值