标签: spring-aop

建议不要在Spring-AOP中调用

我已经声明了以下方面建议dao调用,我正在尝试运行@Before建议,但它不起作用.

这就是方面.

package com.hedgebenefits.aop;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class AccessControlAspect {
    @Before("within(com.hedgebenefits.daos..*) && execution(public * *(..))")
    public void daoCall() {
        System.out.println("Before advice invoked for DAO method called ");
    }
}
Run Code Online (Sandbox Code Playgroud)

我的application-context.xml具有以下标记

<aop:aspectj-autoproxy/>
Run Code Online (Sandbox Code Playgroud)

我的Dao课程如下:

package com.hedgebenefits.daos.impl;

import com.hedgebenefits.daos.AdminDao;
import com.hedgebenefits.domain.Admin;
import org.springframework.stereotype.Repository;

@Repository
public class AdminDaoImpl implements AdminDao{
    @Override
    public void save(Admin admin) {
    }
}
Run Code Online (Sandbox Code Playgroud)

我放了一个断点,但我可以看到它不活跃,我肯定在这里做了一些愚蠢的错误,但无法搞清楚.PL.咨询.

spring spring-aop

7
推荐指数
1
解决办法
4257
查看次数

在Spring AOP中抛出异常

每次我阅读官方的Spring AOP文档(链接)时,我都会对使用RuntimeExceptions的建议行为感到困惑.有人会检查我的未成年人是否适合以下建议?

@之前

  • 建议抛出异常=目标(未执行)建议(已执行)
  • 目标抛出异常=目标(已执行)建议(已执行)

@AfterReturning接口

  • 建议抛出异常=目标(已执行)建议(已执行)
  • 目标抛出异常=目标(已执行)建议(未执行)

@AfterThrowing

  • 建议抛出异常=目标(已执行)建议(未执行)
  • 目标抛出异常=目标(已执行)建议(已执行)

@后

  • 建议抛出异常=目标(已执行)建议(已执行)
  • 目标抛出异常=目标(已执行)建议(已执行)

@周围

  • 建议抛出异常=目标(已执行)建议(已执行)
  • 目标抛出异常=目标(已执行)建议(执行到point.proceed())

aop spring spring-aop

7
推荐指数
1
解决办法
4736
查看次数

IBM Websphere:获取Spring AOP的错误

我在启动服务器时遇到以下错误.应用程序中包含Spring和AspectJ类.

Caused by: java.lang.VerifyError: JVMVRFY013 class loading constraint violated; class=org/springframework/aop/aspectj/MethodInvocationProceedingJoinPoint, method=getSourceLocation()Lorg/aspectj/lang/reflect/SourceLocation;, pc=0
                at java.lang.J9VMInternals.verifyImpl(Native Method)
                at java.lang.J9VMInternals.verify(J9VMInternals.java:93)
                at java.lang.J9VMInternals.initialize(J9VMInternals.java:170)
                at org.springframework.aop.aspectj.AbstractAspectJAdvice.currentJoinPoint(AbstractAspectJAdvice.java:83)
Run Code Online (Sandbox Code Playgroud)

作为第一遍,我为企业应用程序提供了PARENT_FIRST选项

在此输入图像描述

websphere spring spring-aop

7
推荐指数
1
解决办法
5026
查看次数

为什么Spring AOP不拦截受保护的方法

我很熟悉Spring AOP.正如我在春季文档http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/aop.html中所读到的那样,Spring AOP研究代理的概念.

8.2.3.1支持的切入点指示符部分中,我找到了以下注释

由于Spring的AOP框架基于代理的特性,受保护的方法根据定义不会被拦截,既不用于JDK代理(这不适用),也不用于CGLIB代理(这在技术上可行,但不建议用于AOP).因此,任何给定的切入点都只能与公共方法匹配!

起初,我不相信它,所以我试图在不使用接口的情况下实现它,默认情况下所有方法都是公开的,并且对上述情况感到惊讶.由于代理类是建议/目标对象的子类,受保护的方法可以由子类访问,所以我认为受保护的方法可以正常工作.

有人可以告诉我为什么不拦截受保护的方法?我错过了什么吗?

java proxy spring protected spring-aop

7
推荐指数
1
解决办法
2141
查看次数

使用AspectJ spring-aop更改返回值的类型

我想完成从控制器收到的JSON响应,例如状态属性.在这方面,我将使用Aspect类,其中@Around方法返回一个自定义类对象.在这种情况下,我收到一个错误:

java.lang.ClassCastException: *.controller.RestResponse cannot be cast to java.util.List
Run Code Online (Sandbox Code Playgroud)

有没有办法通过aspectJ annotation @Around将@ResponseBody类型的返回更改为自定义类型?我无法更改控制器代码!

控制器类:

@Controller
@RequestMapping(value = "/users")
public class UserController {

@Autowired
private UserService userService;

@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public List<User> get() throws InterruptedException {
    return userService.getUsers();
}
...
}
Run Code Online (Sandbox Code Playgroud)

Aspect类:

@Component
@Aspect
public class RestInterceptor {

@Pointcut("within(* controller.api.*)")
public void endpointMethod() {
}

@Around("endpointMethod()")
public RestResponse unifyResponse(ProceedingJoinPoint pjp) throws Throwable {
    Object controllerResult = pjp.proceed();
    RestResponse result = new RestResponse(0, controllerResult);
    return result;
}
}
Run Code Online (Sandbox Code Playgroud)

自定义类RestResponse:

public class RestResponse{

private …
Run Code Online (Sandbox Code Playgroud)

java aspectj return spring-aop

7
推荐指数
1
解决办法
7709
查看次数

是否有一个AspectJ切入点表达式搜索所有子包?

所以我对使用以下表达式声明的方法有一个方面:

@Before("execution(* aaa.bbb.ccc.*.*(..))")
Run Code Online (Sandbox Code Playgroud)

这适用于包中的所有类aaa.bbb.ccc.但是,现在,我想要捕获所有类aaa.bbb,包括那些类aaa.bbb.ccc.所以我试着把它备份到这里:

@Before("execution(* aaa.bbb.*.*(..))")
Run Code Online (Sandbox Code Playgroud)

aaa.bbb但是,这只会从中获取类,并忽略来自的类aaa.bbb.ccc.有没有办法让表达式递归搜索所有子包?

java aop expression aspectj spring-aop

7
推荐指数
1
解决办法
4969
查看次数

Spring Boot,使用@Configurable和加载时间编织将@Autowire转换为非托管类

我有一组非托管类,我在Spring之外实例化.我一直在尝试使用Spring AOP将加载时间编织@Autowire到这些类的bean中,但到目前为止还没有任何运气.

我一直在使用Tomcat 8和Spring Boot 1.2.0进行测试.

@Configuration尝试设置类的位置如下所示:

@Configuration
@PropertySource("classpath:application.properties")
@EnableSpringConfigured
@EnableLoadTimeWeaving
public class Config
Run Code Online (Sandbox Code Playgroud)

在里面Config我将我想要的bean定义@Auotwire到我的非托管类中:

@Bean
public StateProvider stateProvider() {
    //setup bean
    return new DynamoStateProviderImpl( );
}
Run Code Online (Sandbox Code Playgroud)

非托管bean看起来像这样:

@Configurable(autowire = Autowire.BY_TYPE, dependencyCheck = true,   preConstruction = true)
public class StateOutput implements UnifiedOutput {

@Autowired
private StateProvider stateProvider;
Run Code Online (Sandbox Code Playgroud)

我的pom内有以下deps

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-agent</artifactId>
        <version>2.5.6.SEC03</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
    </dependency>

    <dependency>
        <groupId>javax.el</groupId>
        <artifactId>javax.el-api</artifactId>
        <version>3.0.0</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

到目前为止,我还没有看到任何注入stateProvider …

java spring aspectj spring-aop spring-boot

7
推荐指数
1
解决办法
2610
查看次数

@Around建议究竟如何在Spring AOP中运行?

我正在研究Spring AOP模块,我对AROUND建议的确切运作方式有些怀疑.

阅读官方文档:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html

我可以阅读有关AROUND ADVICE的内容:

围绕建议:围绕连接点的建议,例如方法调用.这是最有力的建议.around通知可以在方法调用之前和之后执行自定义行为.它还负责选择是继续加入点还是通过返回自己的返回值或抛出异常来快速建议的方法执行.

这是周围建议的序列图:

在此输入图像描述

因此,根据我的理解,我可以定义一个建议(我的自定义行为),它将在切入点指定的关节点之前和之后执行.

例如,我可以用这种方式定义AROUND ADVICE:

@Around(“execution(@example.Cacheable * rewards.service..*.*(..))”)
public Object cache(ProceedingJoinPoint point) throws Throwable {
    Object value = cacheStore.get(cacheKey(point));

    if (value == null) {
        value = point.proceed();
        cacheStore.put(cacheKey(point), value);
    }
    return value;
}
Run Code Online (Sandbox Code Playgroud)

在调用服务方法之前和之后执行实现的chaching行为.这样对吗?

我无法完全理解的是它是如何使用ProceedingJoinPoint点参数的.

根据我的理解,它用于选择执行或不执行特定操作但具体如何工作?

另一个疑问是如何正确使用AOP建议如何回答以下问题:

如果我想尝试捕获异常,我必须使用哪些建议?

我认为在这种情况下,答案是使用After throw通知,因为当匹配的方法执行通过抛出异常退出时,通知会执行.

但我不确定它,因为根据我的理解,只有在方法抛出异常时才会执行建议.或者在这种情况下我必须使用**AROUND ADVICE*?

TNX

java aop spring spring-mvc spring-aop

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

一起使用JMockit和Spring AOP

假设我有一个如下所示的程序:

@Component
public class MainAction {
    public void doTheAction() {
        System.out.println("Now doing the action");
    }
}

@Aspect
@Component
public class BeforeAspect {
    @Autowired
    private Logger logger;

    @Before("execution(* thepackagename.MainAction.*(..))")
    public void doBefore() {
        logger.log("The @Before advice has run");
    }
}

@Component
public class Logger {
    public void log(String s) {
        System.out.println(s);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我通过的Eclipse(main方法调用esentially运行它,这是工作的罚款mainAction.doTheAction()后,mainAction被Spring创建).

现在我想编写一个测试,确保在log调用时正确doTheAction调用该方法.我们正在使用JMockit进行测试.(这是我实际遇到的问题的一个非常简化的情况;通过AOP方面调用更复杂的记录器,并且正在记录错误的某些值.在进行修复之前,我正在尝试编写一个测试以确保记录的值是正确的.)

这就是我的(简化)测试目前的样子:

@RunWith(JMockit.class)
@ContextConfiguration(locations = {"classpath:Beans.xml"})
public class MainActionTest {
    @Tested
    private MainAction mainAction;

    @Test
    public void testThatLoggerIsCalled(@Injectable Logger …
Run Code Online (Sandbox Code Playgroud)

java junit jmockit spring-aop

7
推荐指数
1
解决办法
1786
查看次数

java.lang.ClassNotFoundException:org.aspectj.util.PartialOrder $ PartialComparable

我在我的Web应用程序中使用Spring 4.2.4.RELEASE,我想从中删除对aspectjweaver.jar的依赖.我不直接使用AOP,我当然不使用AspectJ.但我的应用程序失败,出现以下异常:

java.lang.ClassNotFoundException: org.aspectj.util.PartialOrder$PartialComparable
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:450)
at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:403)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at org.eclipse.jetty.webapp.WebAppClassLoader.findClass(WebAppClassLoader.java:510)
at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:441)
at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:403)
at org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator.sortAdvisors(AspectJAwareAdvisorAutoProxyCreator.java:73)
at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:91)
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:422)
Run Code Online (Sandbox Code Playgroud)

有什么方法可以完全删除对aspectjweaver.jar的依赖吗?

java spring aspectj spring-aop

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