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框架