public interface Someservice {
void doSome(String name,int age);
}
public class SomeserviceImpl implements Someservice {
@Override
public void doSome(String name,int age) {
//在doSome方法增加一个功能,在doSome执行之前,输出方法执行的时间
System.out.println("------目标方法执行doSome()-------");
}
}
@Aspect
public class MyaspectJ {
@Before(value = "execution(void cn.com.Ycy.spring_aspectJ.bao01.SomeserviceImpl.doSome(String,int))")
public void myBefore(JoinPoint joinPoint){
System.out.println("方法的定义"+joinPoint.getSignature());
System.out.println("方法的名称"+joinPoint.getSignature().getName());
Object[] args = joinPoint.getArgs();
for (Object arg : args) {
System.out.println(arg);
}
System.out.println("切面的功能:在目标方法执行之前需要输出时间:"+new Date());
}
}
表示当前类是切面类
切面类:是用来给业务方法增加功能的类,在这个类中有切面的功能代码
位置:在类定义的上面
定义方法,方法是实现切面的功能的
方法的定义要求
<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="service" class="cn.com.Ycy.spring_aspectJ.bao01.SomeserviceImpl"/>
<bean id="myAspect" class="cn.com.Ycy.spring_aspectJ.bao01.MyaspectJ"/>
<aop:aspectj-autoproxy/>
beans>
aop:aspectj-autoproxy :
声明自动代理生产器:使用aspectJ框架内部的功能,来创建目标对象的代理对象。
创建代理对象是在内存中实现的
aspectj-autoproxy:会把spring容器中所有的目标对象,一次性都生成代理对象
@Test
public void test01(){
String config="ApplicationContext.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(config);
//从容器获取目标对象
Someservice service = (Someservice) ac.getBean("service");
//通过代理对象执行方法,实现目标方法执行时,增强了功能
service.doSome("张三",20);
}
@Aspect
public class MyaspectJ {
@Before(value = "execution(void cn.com.Ycy.spring_aspectJ.bao01.SomeserviceImpl.doSome(..))")
public void myBefore(){
System.out.println("切面的功能:在目标方法执行之前需要输出时间:"+new Date());
}
}
如果有参数,不是自定义的,有几个可以选择使用,指定通知方法中的参数:JoinPoint
如果你的切面功能需要用到方法的信息,就需要加入Joinpoint
这个JoinPoint参数的值是由框架赋予的,必须是第一个位置的参数
JoinPoint:业务方法,需要加入切面的业务方法
作用是:可以在通知方法中获取方法执行时的信息
@Aspect
public class MyaspectJ {
@Before(value = "execution(void cn.com.Ycy.spring_aspectJ.bao01.SomeserviceImpl.doSome(String,int))")
public void myBefore(JoinPoint joinPoint){
System.out.println("方法的定义"+joinPoint.getSignature());
System.out.println("方法的名称"+joinPoint.getSignature().getName());
Object[] args = joinPoint.getArgs();
for (Object arg : args) {
System.out.println(arg);
}
System.out.println("切面的功能:在目标方法执行之前需要输出时间:"+new Date());
}
}
方法的定义void cn.com.Ycy.spring_aspectJ.bao01.Someservice.doSome(String,int)
方法的名称doSome
张三
20
切面的功能:在目标方法执行之前需要输出时间:Sun Aug 02 21:43:33 CST 2020
-----目标方法执行doSome()-------