标签: spring-aop

Aspectj覆盖方法的参数

我正在开发一个方面来检查setter方法的参数并用空值覆盖空字符串.到目前为止,这是我的州:

@Before("execution(* de.foo.entity.*.set*(..)) && args(java.lang.String)")
public void check(final JoinPoint jp) {
    LOGGER.debug(jp.getSignature().toLongString());
    Object[] args = jp.getArgs();
    for (int i = 0; i < args.length; i++) {
        if (args[i] instanceof String && ((String) args[i]).isEmpty()) {
            args[i] = null;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,覆盖语句args[i] = null;现在可以正常工作!有谁知道我该怎么覆盖它?

干杯,

凯文

java aop aspectj spring-aop

10
推荐指数
1
解决办法
1万
查看次数

自动连接的依赖项未在Spring MVC中的Aspect中注入

我无法@Autowire在Aspect中使用服务层实例.在Aspect中,对@Autowiredbean 的引用是NULL并且它会抛出NullPointerException.任何帮助都感激不尽.我想,我搞砸了配置.

以下是我的servlet-context.xml:

<!-- Activates various annotations to be detected in bean classes -->
<context:annotation-config />
<context:spring-configured />       

<!-- Scans the classpath of this application for @Components to deploy as beans -->
<context:component-scan base-package="xx.yy" />

<!--  an @AspectJ aspect will be interpreted as an aspect by Spring AOP and beans in the context will be advised accordingly -->
<aop:aspectj-autoproxy />

<beans:bean id="loggingAspect" class="xx.yy.aop.aspects.LoggingAspect" />
<beans:bean id="authenticationAspect" class="xx.yy.aop.aspects.AuthenticationAspect" />

<!-- Enables the Spring …
Run Code Online (Sandbox Code Playgroud)

aop aspectj spring-mvc spring-aop

10
推荐指数
1
解决办法
8974
查看次数

java.lang.IllegalArgumentException:切入点处于:: 0正式未绑定时出错

Thinker.java

package springdemo2;

public interface Thinker {
    void thinkOfSomething(String thoughts); 
}
Run Code Online (Sandbox Code Playgroud)

Volunteer.java

package springdemo2;

public class Volunteer implements Thinker{
    private String thoughts;

    @Override
    public void thinkOfSomething(String thoughts) {
        this.thoughts=thoughts;
    }

    public String getThoughts(){
        return thoughts;
    }
}
Run Code Online (Sandbox Code Playgroud)

MindReader.java

package springdemo2;

public interface MindReader {
    void interceptThoughts(String thoughts);

    String getThoughts();
}
Run Code Online (Sandbox Code Playgroud)

Magician.java

package springdemo2;

import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 
import org.aspectj.lang.annotation.Pointcut;

@Aspect 
public class Magician implements MindReader {

    private String thoughts;

    @Pointcut("execution(* springdemo2."
            + "Thinker.thinkOfSomething(String)) and args(thoughts)")
    public void thinking(String thoughts){
    } …
Run Code Online (Sandbox Code Playgroud)

aop spring spring-aop

10
推荐指数
1
解决办法
3万
查看次数

Spring AOP:对任何名为x的方法的注释不起作用

我是第一次开始使用AOP.

我的第一个方面如下:

@Aspect
public class SyncLoggingAspect {
    private final Logger logger = Logger.getLogger(this.getClass());

    @Before("execution(public * *(..))")
    public void anyPublic() {
        System.out.println("HIT POINTCUT");
    }
}
Run Code Online (Sandbox Code Playgroud)

这成功地继续在任何公共方法调用上调用.但是,当我将其更改为:

@Before("execution(public * doPoll(..))")
public void anyPublic() {
    System.out.println("HIT POINTCUT");
}
Run Code Online (Sandbox Code Playgroud)

我希望它可以在任何名为"doPoll"的公共方法上工作,但是当这样的方法被称为没有任何反应时:

public class GmailContactPoller extends ContactPoller<GoogleUser, ContactPusher<GoogleUser>> {
    Logger logger = Logger.getLogger(this.getClass());

    @Override
    public List<? extends ContactPusher<GoogleUser>> doPoll() throws PollException {
           ...
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有EL语法中缺少的东西?或者这与继承层次结构有关?doPoll的超类方法在名为Poller的抽象类中是抽象的.没有接口会导致问题吗?

编辑:我刚注意到我的IDE启用了弹簧方面工具,现在我通过该方法发出以下编译器警告:

"尚未应用datasync.aop.aspects.SyncLoggingAspect中定义的描述资源路径位置类型建议[Xlint:adviceDidNotMatch] SyncLoggingAspect.java/DataSync/src/main/datasync/aop/aspects"

aop spring spring-aop

10
推荐指数
1
解决办法
3703
查看次数

启用S​​pring AOP或AspectJ

这是从这个问题继续:

@Aspect方面的Spring autowired bean为null

我最初的理解是,当使用Spring AOP时,使用@Aspect注释的类被创建为spring managed beans,因此依赖注入将正常工作.但是,似乎带有@Aspect注释的对象被创建为弹簧容器外的单例,因此我必须像XML一样配置它,以便将其作为spring托管bean启用:

<bean id="aspect" class="com.mysite.aspect" factory-method="aspectOf" />
Run Code Online (Sandbox Code Playgroud)

这已经让我完全糊涂了.我认为以下配置将使用spring AOP:

<context:component-scan base-package="com.mysite.aspectPackage"/>
<aop:aspectj-autoproxy/>
Run Code Online (Sandbox Code Playgroud)

因此,它将使用组件扫描创建方面bean来扫描@Aspect注释,然后autoproxy将创建一个beanPostProcessor,它使用适当的建议代理我的上下文中的所有bean.然后我想要启用aspectJ我需要一个完全不同的XML配置(顺便说一下,我似乎无法在文档中找到一个例子).正是这种配置使用aspectJ来创建可以在我的容器之外的方面,或者通过操作字节码而不是代理来工作.

注意
这不是关于spring AOP和J方面之间差异的问题,这里有很好的阐述:

Spring AOP vs AspectJ

java aop spring spring-aop

10
推荐指数
2
解决办法
2万
查看次数

Spring AOP:"找不到元素'aop:config'的声明"

我已经看到已经提出了一些这个问题的实例.但是,我相信我满足这些解决方案中列出的标准.即我很确定我的课程路径上有所需的罐子+我的原理配置地址按顺序查看.

一个解决方案提到该问题可能是由于在类路径上有另一个XML解析器引起的.我在我的类路径上有dom4j,但我已将其删除以进行测试,问题仍然存在.

这是我的类路径:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="src" path="test"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/mysql-connector-java-5.1.18-bin.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/jaxen-1.1.3.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.aop-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.asm-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.aspects-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.beans-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.context.support-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.context-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.core-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.expression-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.instrument.tomcat-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.instrument-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.jdbc-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.jms-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.orm-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.oxm-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.test-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.transaction-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.web.portlet-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.web.servlet-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.web.struts-3.1.0.RC1.jar"/>
    <classpathentry …
Run Code Online (Sandbox Code Playgroud)

java spring aspectj spring-aop

10
推荐指数
1
解决办法
2万
查看次数

Log4j和AOP,如何获取实际的类名

我正在使用Spring AOP和Log4J实现一个记录器作为一个方面,但我注意到日志文件中的LoggerAspect类名始终是类名,所以...有没有办法在我的日志中跟踪实际的类名?

java spring log4j spring-aop

10
推荐指数
2
解决办法
9451
查看次数

Spring切入点指示符差异(内部vs执行)

请...有人能解释一下使用以下弹簧切入点指示符之间有什么区别吗?

使用"切入点指示符":

<aop:pointcut expression="within(my.app.dao.impl.*)" id="commonDaoOperation"/>
Run Code Online (Sandbox Code Playgroud)

使用"执行切入点指示符":

<aop:pointcut expression="execution(public * my.app.dao.impl.*.*(..))" id="commonDaoOperation"/>
Run Code Online (Sandbox Code Playgroud)

我在我的web项目中使用第二个(我认为它是最常用的),我用这种方法发现的问题是它在堆中消耗了大量内存......

在使用"eclipse内存分析器"分析应用程序服务器的"堆转储"后,我发现我的应用程序消耗了450 MB,并且该类的实例"org.springframework.aop.aspectj.AspectJExpressionPointcut"正在消耗这些450 MB的30%......

每个实例AspectJExpressionPointcut占用6 MB(大约),这是因为每个实例都保留了与java.lang.reflect.Method实例匹配的缓存,并且令人惊讶的是有很多java方法被缓存(我的切入点表达式没有提到的方法).

在阅读Spring Documentation之后,我决定使用第一种方法(在切入点指示符内),现在每个实例AspectJExpressionPointcut占用的内存都少得多.

问题是关于......他们之间的表现有什么不同......

提前谢谢了...

java spring spring-aop pointcut

10
推荐指数
1
解决办法
9265
查看次数

Spring自我注入交易

在Spring中,你不能简单地@Transactional从同一个实例调用方法,因为AOP代理的东西.自我注入并从自代理实例调用该方法是不是一个好主意?你看到任何缺点吗?

java spring spring-aop spring-transactions

10
推荐指数
1
解决办法
3372
查看次数

Spring 4连接点获取方法参数名称和值

我使用的是Spring 4.3.是否可以获取传递给它的方法参数名称和值?我相信这可以使用AOP(建议之前)完成,如果可能的话,请给我一个源代码.

spring spring-aop

10
推荐指数
3
解决办法
1万
查看次数