AspectJ的两种实现

使用Aspectj来开发AOP的一个小例子

① 基于xml方式实现:

  • 切面类
public class MyAspect {

    public void myBefore(JoinPoint joinPoint){
        System.out.println("前置通知 "+joinPoint.getSignature().getName());
    }

    public void myAfterRetruning(JoinPoint joinPoint){
        System.out.println("后置通知"+ joinPoint.getSignature().getName());
    }
}
  • 接口类
public interface UserService {
    public void addUser();
    public String updateUser();
    public void deleteUser();
}
  • applicationContext.xml
	<!-- 1. 创建实体类 -->
    <bean id="userServiceId" class="com.itt.c_aspectj_xml.UserServiceImpl"></bean>

    <!-- 2. 创建切面类-->
    <bean id="aspectId" class="com.itt.c_aspectj_xml.MyAspect"></bean>

    <!-- 3. 创建代理类-->
    <!-- 
    	<aop:aspect>将切面类声明“切面”, 获得通知
    		<aop:pointcut> 切入点,expression:为切入点表达式
    			<aop:before method="" pointcut-ref="">
    				前置通知,method为通知的方法,pointcut-ref为切入点的引用
    -->
    <aop:config>
        <aop:aspect ref="aspectId">
            <aop:pointcut id="myaspectId" expression="execution(* com.itt.c_aspectj_xml.UserServiceImpl.*(..))"/>
                <aop:before method="myBefore" pointcut-ref="myaspectId"></aop:before>
                <aop:after method="myAfterRetruning" pointcut-ref="myaspectId"></aop:after>
        </aop:aspect>
    </aop:config>
  • 运行结果…
    在这里插入图片描述

②基于注解方式:

  • 切面类
//切面类
@Component
@Aspect
public class MyAspect {

//    声明公共切入点
    @Pointcut("execution(* com.itt.c_aspectj_xml.UserServiceImpl.*(..))")
    public void myPoint(){

    }

    @Before(value = "myPoint()")
    public void myBefore(JoinPoint joinPoint){
        System.out.println("前置通知 "+joinPoint.getSignature().getName());
    }

    @After(value = "myPoint()")
    public void myAfterRetruning(JoinPoint joinPoint){
        System.out.println("后置通知"+ joinPoint.getSignature().getName());
    }
}
  • 实现类
@Service("userServiceId")//指定生成的Bean的id
public class UserServiceImpl  implements  UserService{
    @Override
    public void addUser() {
        System.out.println("c_aspectj_xml addUser");
    }

    @Override
    public String updateUser() {
        System.out.println("c_aspectj_xml updateUser");
        return "String";
    }

    @Override
    public void deleteUser() {
        System.out.println("c_aspectj_xml deleteUser");
    }
}
  • applicationContext.xml
	<!--扫描所有的注解-->
    <context:component-scan base-package="com.itt.c_aspectj_xml"></context:component-scan>
    <!--确定aop注解生效-->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
  • 测试一下
    在这里插入图片描述
发布了25 篇原创文章 · 获赞 22 · 访问量 5416

猜你喜欢

转载自blog.csdn.net/weixin_42893085/article/details/104414823