Spring框架学习 基于注解的声明式AspectJ

萌新报道,大神求带

今天在编码时遇到一个错误

错误源码:

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:564)

    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)

    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)

    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)

    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)

    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)

    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)

    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866)

    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542)

    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)

    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)

    at com.systop.aspectj.xml.TestXmlAspectj.main(TestXmlAspectj.java:12)

Caused by: java.lang.IllegalArgumentException: Pointcut is not well-formed: expecting 'identifier' at character position 0

* com.systop.jdk.*.*(..)

^

 

    at org.aspectj.weaver.tools.PointcutParser.resolvePointcutExpression(PointcutParser.java:316)

    at org.aspectj.weaver.reflect.InternalUseOnlyPointcutParser.resolvePointcutExpression(InternalUseOnlyPointcutParser.java:36)

    at org.aspectj.weaver.reflect.Java15ReflectionBasedReferenceTypeDelegate.getDeclaredPointcuts(Java15ReflectionBasedReferenceTypeDelegate.java:307)

    at org.aspectj.weaver.ReferenceType.getDeclaredPointcuts(ReferenceType.java:884)

    at org.aspectj.weaver.ResolvedType$PointcutGetter.get(ResolvedType.java:243)

    at org.aspectj.weaver.ResolvedType$PointcutGetter.get(ResolvedType.java:24

1)

    at org.aspectj.weaver.Iterators$4$1.hasNext(Iterators.java:213)

    at org.aspectj.weaver.Iterators$4.hasNext(Iterators.java:230)

    at org.aspectj.weaver.ResolvedType.findPointcut(ResolvedType.java:743)

    at org.aspectj.weaver.patterns.ReferencePointcut.resolveBindings(ReferencePointcut.java:148)

    at org.aspectj.weaver.patterns.Pointcut.resolve(Pointcut.java:189)

    at org.aspectj.weaver.tools.PointcutParser.resolvePointcutExpression(PointcutParser.java:313)

    at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:294)

    at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:217)

    at org.springframework.aop.aspectj.AspectJExpressionPointcut.checkReadyToMatch(AspectJExpressionPointcut.java:190)

    at org.springframework.aop.aspectj.AspectJExpressionPointcut.getClassFilter(AspectJExpressionPointcut.java:169)

    at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:220)

    at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:279)

    at org.springframework.aop.support.AopUtils.findAdvisorsThatCanApply(AopUtils.java:311)

    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findAdvisorsThatCanApply(AbstractAdvisorAutoProxyCreator.java:118)

    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:88)

    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator.java:69)

    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:346)

    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:298)

    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:423)

    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1633)

    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)

    ... 11 more

 

找了很久,查了资料才发现是因为少了这个小可爱

图片

添加上就可以正常运行了

贴出源码以供参考:

MyAspect页面

package com.systop.aspectj.annotation;

import org.aspectj.lang.JoinPoint;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.After;

import org.aspectj.lang.annotation.AfterReturning;

import org.aspectj.lang.annotation.AfterThrowing;

import org.aspectj.lang.annotation.Around;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Before;

import org.aspectj.lang.annotation.Pointcut;

import org.springframework.stereotype.Component;

 

/**

 * 切面类,在此类中编写通知

 * @author

 *

 */

@Aspect

@Component

public class MyAspect {

  //定义切入点表达式

    @Pointcut("execution* com.systop.jdk.*.*(..)")

    //使用一个返回值为void,方法体为空的方法来命名切入点

    private void myPointCut(){}

  //前置通知

    @Before("myPointCut()")

    public void myBefore(JoinPoint joinPoint){

       System.out.println("前置通知:模拟执行权限检查....,");

       System.out.println("目标类是:"+joinPoint.getTarget());

       System.out.println(",被织入增强处理的目标方法为"+joinPoint.getSignature().getName());

    }

  //后置通知

    @AfterReturning(value="myPointCut()")

    public void myAfterReturning(JoinPoint joinPoint){

       System.out.println("后置通知:模拟记录日志....,");

       System.out.println(",被织入增强处理的目标方法为"+joinPoint.getSignature().getName());

      

    }

    /**

     * 环绕通知

     * ProceedingJoinPoint JoinPoint子接口,表示可以执行目标方法

     * 1.必须是Object类型的返回值

     * 2.必须接受一个参数,类型为ProceedingJoinPoint

     * 3.必须throws Throwable

     */

    @Around("myPointCut()")

    public Object myAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{

       //开始

       System.out.println("环绕开始:执行目标方法之前,模拟开启事物...");

       Object obj=proceedingJoinPoint.proceed();

       //结束

       System.out.println("环绕结束:执行目标方法之后,模拟关闭事物...");

       return proceedingJoinPoint;

    }

    //异常通知

    @AfterThrowing(value="myPointCut()",throwing="e")

    public void myAfterThrowing(JoinPoint joinPoint,Throwable e){

       System.out.println("异常通知"+"出错了"+e.getMessage());

    }

    //最后通知

    @After("myPointCut()")

    public void myAfter(){

       System.out.println("最终通知:模拟方法结束后的释放资源");

    }

}

配置文件 applicationContext.xml

<?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"

       xmlns:context="http://www.springframework.org/schema/context"

       xsi:schemaLocation="http://www.springframework.org/schema/beans

       http://www.springframework.org/schema/beans/spring-beans-4.3.xsd

       http://www.springframework.org/schema/aop

       http://www.springframework.org/schema/aop/spring-aop-4.3.xsd

       http://www.springframework.org/schema/context

       http://www.springframework.org/schema/context/spring-context-4.3.xsd

       ">

<!-- 制定需要扫描的包,使注解生效 -->

<context:component-scan base-package="com.systop.aspectj"/>

<context:component-scan base-package="com.systop.jdk"/>

<!-- 基于注解的生命式AspectJ支持 -->

 <aop:aspectj-autoproxy/>

</beans>

测试文件TestXmlAspectj

package com.systop.aspectj.annotation;

 

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

 

import com.systop.jdk.UserDao;

public class TestXmlAspectj {

         public static void main(String[] args) {

                   //定义配置文件路径

                    String xmlPath="com/systop/aspectj/annotation/applicationContext.xml";

                   //加载配置文件

                    ApplicationContext applicationContext=new ClassPathXmlApplicationContext(xmlPath);

                      //1从spring容器获得内容

                      UserDao userDao=(UserDao) applicationContext.getBean("userDao");

                      //2执行方法

                      userDao.addUser(); 

         }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值