Spring实现AOP的方式有三种
方式一:使用<aop:advisor >的形式,此时要将类实现相应的接口。
方式二:使用<aop:aspect >的形式,只需要自己写的一个类,类中有定义方法即可。
方式三:使用相关的注解。@Aspect、@Before、@After
方式1代码实现:
java代码:
public class AfterLogClass implements AfterReturningAdvice {
@Override
public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
System.out.println(o1.getClass().getSimpleName()+"类,中的"+method.getName()+"方法被调用啦!");
}
}
public class BeforeLogClass implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println(o.getClass().getSimpleName()+"类的,"+method.getName()+"方法被调用啦!!!");
}
}
applicationContext.xml文件代码:
<!--方式1,使用了API接口实现AOP面向切面编程-->
<bean id="before" class="com.school.log.BeforeLogClass"/>
<bean id="after" class="com.school.log.AfterLogClass"/>
<bean id="userService" class="com.school.service.UserServiceImpl"/>
<!--设置与aop有关的配置信息,导入相关的约束-->
<aop:config>
<!--没有显示的定义aop切面-->
<!--创建切点,expression,这是一个表达式,可以指定要切入的方法,可以把这个理解成一个过滤器,执行到这里的时候就添加相应的方法-->
<!--返回值,类,方法,参数-->
<aop:pointcut id="pointcut" expression="execution(* com.school.service.UserServiceImpl.*(..))"/>
<!--aop顾问,可以理解为通知-->
<!--解释:Advisor充当Advice(通知)和Pointcut的适配器 , 一般会有advice和pointcut属性
大多数切面是由定义切面行为的通知 和 定义切面在什么地方执行的切入点组合而成 . spring认识到这一点 , 提供了Advisor类
这个类将通知和切入点组合到一个对象中 -->
<!--< aop:advisor>:定义通知器(通知器跟切面一样,也包括通知和切点)-->
<aop:advisor advice-ref="after" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="before" pointcut-ref="pointcut"/>
</aop:config>
方式2代码实现:
java代码:
public class UserLogAOP {
public void before(){
System.out.println("我是在切入点之前执行的一个方法!");
}
public void after(){
System.out.println("我是在切入点之后执行的方法!!");
}
}
applicationContext.xml文件代码:
<bean id="user1" class="com.school.service.UserServiceImpl"/>
<bean id="userAOP" class="com.school.util.UserLogAOP"/>
<aop:config>
<!--在aop切面里面写-->
<!--自定义切面,ref="userAOP"要引用的类-->
<aop:aspect ref="userAOP" >
<!--切入点-->
<aop:pointcut id="pointCut" expression="execution(* com.school.service.UserServiceImpl.*(..))"/>
<!--通知-->
<aop:after method="after" pointcut-ref="pointCut"/>
<aop:before method="before" pointcut-ref="pointCut"/>
</aop:aspect>
</aop:config>
方式3代码实现:
java代码:
public class UserLogAOP {
/*切入点:execution*/
@Before("execution(* com.school.service.UserServiceImpl.*(..))")
public void before(){
System.out.println("这是一个在方法之前执,,,,行");
}
@After("execution(* com.school.service.UserServiceImpl.*(..))")
public void after(){
System.out.println("这是一个在方法之后执行!!!!");
}
}
applicationContext.xml代码:
<!--aspectj-autoproxy自动装配,类似于用注解配置Bean一样,可以理解为开启注解支持-->
<bean id="user" class="com.school.service.UserServiceImpl"/>
<!--将注解类注册到spring中-->
<bean id="userLog" class="com.school.util.UserLogAOP"/>
<!--声明自动为spring容器中那些配置@aspectJ切面的bean创建代理,织入切面。-->
<aop:aspectj-autoproxy/>
总结:
这几种方式都可以实现AOP,但是比较推荐使用注解的方式(懒到底),其中的aop:advisor和aop:aspect没有理解的很全面,有些注释内容是参考别的博客写的,这里放上链接地址。
链接1:https://blog.csdn.net/u011983531/article/details/70504281
链接2:https://blog.csdn.net/sybnfkn040601/article/details/65447425