grails 中的面向方面的编程问题。切入点方法未执行
Aspect-Oriented programming issue in grails . Point-cut methods are not executing
我正在使用 Grails 2.4.3。在 resource.groovy 我添加了组件扫描
xmlns aop:"http://www.springframework.org/schema/aop"
context.'component-scan'('base-package': 'com')
然后在 src/groovy 我创建了 groovy class
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中的保存函数定义为
def save(def entity){
if(entity.id == null){
entity.createdDate = new Date()
}
entity.lastUpdatedDate = new Date()
log.debug(entity)
neo4jTemplate.save(entity)
}
而BaseOptionService是由UserService扩展的,其中调用了BaseOptionService方法
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语句,也没有报错。我不确定我做错了什么。请帮忙。
当您的应用程序启动时,组件扫描将扫描所有包以检查存在哪些 bean。
如果 bean 没有被任何其他 class 引用,这个过程无论如何都不会实例化 bean。换句话说,你是说是的,我有一个 MongoAspectAdvice class,它用 @Component 注释,所以它也是一个单例,但你在哪里使用它?
尝试在 UserService 中导入它。
然后,如果仍然无法正常工作(检查您是否可以在 class 中放置断点),请向您添加以下代码 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
我正在使用 Grails 2.4.3。在 resource.groovy 我添加了组件扫描
xmlns aop:"http://www.springframework.org/schema/aop"
context.'component-scan'('base-package': 'com')
然后在 src/groovy 我创建了 groovy class
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中的保存函数定义为
def save(def entity){
if(entity.id == null){
entity.createdDate = new Date()
}
entity.lastUpdatedDate = new Date()
log.debug(entity)
neo4jTemplate.save(entity)
}
而BaseOptionService是由UserService扩展的,其中调用了BaseOptionService方法
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语句,也没有报错。我不确定我做错了什么。请帮忙。
当您的应用程序启动时,组件扫描将扫描所有包以检查存在哪些 bean。 如果 bean 没有被任何其他 class 引用,这个过程无论如何都不会实例化 bean。换句话说,你是说是的,我有一个 MongoAspectAdvice class,它用 @Component 注释,所以它也是一个单例,但你在哪里使用它? 尝试在 UserService 中导入它。 然后,如果仍然无法正常工作(检查您是否可以在 class 中放置断点),请向您添加以下代码 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