使用aspectJ实现aop实例

1. 创建目标接口和实现类

package com.bjpowernode.service;
/*接口实现类*/
public class SomeServiceImpl implements SomeService {
    @Override
    public void doSome(String name,Integer age) {
        System.out.println("Hello "+name+"欢迎使用spring框架");
    }
}

package com.bjpowernode.service;
/*目标类的接口*/
public interface SomeService {
    void doSome(String name,Integer age);
}

2. 创建切面类

package com.bjpowernode.Utils;

import jdk.internal.org.objectweb.asm.tree.analysis.Value;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

import java.text.SimpleDateFormat;
import java.util.Date;

/**切面类,实现显示执行时间的方法
* @Aspect:是aspectJ中的注解
* 作用:标识当前类是切面类
* 切面类:是用来给业务方法增加功能的类,在这个类中有切面的功能代码
* 位置:在类定义的上面
* */
@Aspect
public class ShowTime {
    /**
     * 切面方法:
     * 要求公共的方法(public),
     * 无返回值的方法,
     * 方法名称自定义
     * 可以有参数,参数不是自定义的
     */

    /**
     * @Before:前置通知注解
     * 属性:value 指定了切入点的位置
     */
    @Before(value = "execution(public void com.bjpowernode.service.SomeServiceImpl.doSome(String,Integer))")
    public void showCurrentTime(){
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss SSS");
        String sdate =sdf.format(date);
        System.out.println("前置执行:执行了切面代码,展示当前时间:"+sdate);
    }
}

3. 使用spring容器管理类的创建

<?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 https://www.springframework.org/schema/aop/spring-aop.xsd">
    <!--目标类对象-->
    <bean id="mySomeServiceImpl" class="com.bjpowernode.service.SomeServiceImpl"/>
    <!--切面类对象-->
    <bean class="com.bjpowernode.Utils.ShowTime"/>
    <!--声明自动代理生成器:使用aspectJ框架内部的功能,创建目标对象的代理对象
    创建代理对象是在内存中实现的,修改目标对象的内存中的结构。创建为代理对象,所以目标对象
    就是被修改后的代理对象
  
aspectj-autoproxy:会把spring容器中的所有的目标对象,一次性都生成代理对象
  -->
    <aop:aspectj-autoproxy/>
</beans>


4. 创建目标类对象并使用。

package com.bjpowernode;

import com.bjpowernode.service.SomeService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    @Test
    public void test01(){
        String conf = "ApplicationContext.xml";
        ApplicationContext ac = new ClassPathXmlApplicationContext(conf);
        SomeService someService = (SomeService) ac.getBean("mySomeServiceImpl");
        someService.doSome("lisi",22);

    }
}

6. 执行结果:

前置执行:执行了切面代码,展示当前时间:2021/03/03 00:32:30 916
Hello lisi欢迎使用spring框架

使用aspectJ实现aop实例

上一篇:微信公众号之推送消息


下一篇:PHP 配置Xdebug调试工具