【问题标题】:Aspect-Oriented programming issue in grails . Point-cut methods are not executinggrails 中面向方面的编程问题。切入点方法未执行
【发布时间】:2015-02-05 07:23:31
【问题描述】:

我正在使用 Grails 2.4.3 。在 resource.groovy 我添加了组件扫描

xmlns aop:"http://www.springframework.org/schema/aop"
context.'component-scan'('base-package': 'com')

然后在 src/groovy 我创建了 groovy 类

package com.demo.aspects.mongo.history;

import grails.transaction.Transactional
import org.aspectj.lang.annotation.Aspect
import org.aspectj.lang.annotation.Before
import org.aspectj.lang.annotation.After
import org.springframework.stereotype.Component

@Aspect
@Component
@Transactional
public class MongoAspectAdvice {
    @After("execution(* com.demo.global.BaseOptionService.save(..))")
    def afterMethod(){
        println "after method execution"
    }

    @Before("execution(* com.demo.global.BaseOptionService.save(..))")
    def beforeMethod(){
        println "before method execution"
    }
}

并且com.demo.global.BaseOptionService中的save函数定义为

def save(def entity){
        if(entity.id == null){
            entity.createdDate = new Date()
        }
        entity.lastUpdatedDate = new Date()
        log.debug(entity)
        neo4jTemplate.save(entity)
    }

BaseOptionService 是由调用BaseOptionService 方法的UserService 扩展而来的。

UserService.groovy

         class UserService extends BaseOptionService{

    def addUser(username,email,role,phonenumber){
        log.debug "user ===== "+username
        UserCommand userCommand = new UserCommand()

        userCommand.username = username
        userCommand.email = email
        userCommand.phonenumber = phonenumber
        userCommand.role = role
        if(userCommand.labels?.empty == true || userCommand.labels == null){
            if(role == null){
                userCommand.addLabel(null)
            }else{
            userCommand.addLabel("_USER")
            userCommand.addLabel(role)
            }
        }
        userCommand.isActive = true
        userCommand.token = null

        UserDomain user = userCommand.getUser()
        log.debug "user == "+user
        save(user)
        return user
    }

    def removeLabels(id,label){
        UserDomain user = findOne(id,UserDomain)
        if(user.labels?.contains(label)){
            user.labels.remove(label)
        }
        save(user)
        return user
    }

    def serviceMethod() {

    }
}

save函数执行时,在控制台中没有看到afterMethod和beforeMethod的println语句,也没有报错。我不确定我做错了什么。请帮忙。

【问题讨论】:

    标签: java spring spring-mvc grails groovy


    【解决方案1】:

    当您的应用程序启动时,组件扫描将扫描所有包以检查存在哪些 bean。 如果 bean 没有被任何其他类引用,这个过程无论如何都不会实例化 bean。换句话说,你说是的,我有一个用 @Component 注释的 MongoAspectAdvice 类,所以它也是一个单例,但你在哪里使用它? 尝试在 UserService 中导入它。 然后,如果仍然无法正常工作(以检查您是否可以在该类中放置断点)将以下代码添加到您的 resources.groovy:

    // Place your Spring DSL code here
    beans = {
    mongoAspectAdvice(MongoAspectAdvice) { bean ->
    bean.autowire = "byName"
    }
    

    然后在你的服务中导入:

    def mongoAspectAdvice
    

    但是,您可以通过使用一些 grails ad-hc 闭包来复制此行为:

    def beforeInterceptor = {
        println "Tracing action ${actionUri}"
    } 
    

    def afterInterceptor = {
        println "Tracing action ${actionUri}"
    }
    

    将它们放在 BaseOptionService 中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-03
      • 2015-04-22
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多