Tag: spring aop

将模拟bean注入spring环境进行测试

我知道有类似的问题,例如在这里 ,但是做了搜索,我找到了一个解决方案,我在这里更开心 然而,我唯一的问题是我不确定如何实现这个解决方案。 我希望能够做的是通过HotswappableTargetSource覆盖我的应用程序上下文中的选择bean的bean定义和我的测试版本,然后运行测试。 然后,对于每个测试用例,我想指定哪些bean我想要热插拔,然后每个测试必须能够创建自己的模拟版本并交换它们,并能够再次交换回来。 我能够获得运行测试的应用程序上下文,但我不知道如何配置bean可热插拔。 我知道如何在使用xml配置bean时这样做,但我不想回到使用xml来配置bean。

为什么Spring AOP不会在运行时编织外部jar?

我有一个基于Spring 3的java应用程序构建。这个项目有另一个jar作为依赖。 此依赖项包含@org.aspectj.lang.annotation.Aspect类(例如, com.aspectprovider.aspects.MyAspect )。 有一个@Before建议从实现接口Foo类编织一个方法。 就像是: @Before(“execution(* com.project.Foo.save(..))”) Foo接口可以在“项目”内或在另一个jar中。 这个例子没关系。 我的项目包含实现Foo类。 当然,那些是我希望它编织的类。 My Spring应用程序上下文配置文件( applicationContext.xml )包含以下行: 我还将方面声明为bean,并注入一些属性: 通过日志记录,我可以看到MyAspect已实例化并且属性已注入。 但方法保存不被截获。 这就是问题。 如果我将方面类从jar复制到具有Spring的应用程序,它可以工作。 当这些方面包含在外部jar中时,方法save不会被截获。 有什么线索吗? 编辑:我如何调用Foo的保存方法: //in a JSF managed bean @Inject private Foo myFoo; //there’s a implementation of Foo in a package that spring is looking at. So it is injected correctly. public String someAction() […]

Spring AOP CGLIB代理的字段为空

描述 使用vlcj组件时,自定义组件将作为AOP代理对象null的结果出现。 MediaList类 public class MediaList { private libvlc_media_list_t mediaListInstance; public MediaList(LibVlc libvlc, libvlc_instance_t instance, libvlc_media_list_t mediaListInstance) { this.libvlc = libvlc; this.instance = instance; createInstance(mediaListInstance); } private void createInstance(libvlc_media_list_t mediaListInstance) { logger.debug(“createInstance()”); if(mediaListInstance == null) { mediaListInstance = libvlc.libvlc_media_list_new(instance); } else { libvlc.libvlc_media_list_retain(mediaListInstance); } this.mediaListInstance = mediaListInstance; // <- assignment logger.debug("mediaListInstance={}", mediaListInstance); mediaListEventManager = libvlc.libvlc_media_list_event_manager(mediaListInstance); […]

Spring AOP:访问参数名称

我正在使用Spring 3.x,Java 6。 我有一个带有以下连接点的@Around方面: @Around(“execution(public * my.service.*.*Connector.*(..))”) 所以,我基本上有兴趣拦截所有对类的公共方法的调用,类名以“Connector”结尾。 到现在为止还挺好。 现在,在我的方面,我想访问方法的实际参数名称: public doStuff(String myarg, Long anotherArg) myarg和另一个Arg 我明白使用: CodeSignature signature = (CodeSignature)jointPoint.getSignature(); return signature.getParameterNames(); 将实际工作,但只有当我使用“ -g ”标志(完全调试)编译代码时,我宁愿不这样做。 有没有其他方法可以访问这种运行时信息。 谢谢你

旧的“@Transactional来自同一类”的情况

原始问题的概要:使用带有AOP代理的标准Spring事务,不可能从同一类中的非@Transactional-marked方法调用@Transactional-marked方法并且在事务内(特别是由于前面提到的)代理)。 据说在AspectJ模式下使用Spring Transactions可以实现这一点,但它是如何完成的? 编辑:使用加载时编织在AspectJ模式下Spring事务的完整纲要: 将以下内容添加到META-INF/spring/applicationContext.xml : (我假设您已经在应用程序上下文中设置了AnnotationSessionFactoryBean和HibernateTransactionManager 。您可以将transaction-manager=”transactionManager”作为属性添加到标记中,但是如果值为事务管理器bean的id属性实际上是“ transactionManager ”,然后它是多余的,因为“ transactionManager ”是该属性的默认值。) 添加META-INF/aop.xml 。 内容如下: 将aspectjweaver-1.7.0.jar和spring-aspects-3.1.2.RELEASE.jar到classpath 。 我使用Maven作为我的构建工具,所以这里是项目的POM.xml文件的声明: org.aspectj aspectjweaver 1.7.0 org.springframework spring-aspects 3.1.2.RELEASE spring-instrument-3.1.2.RELEASE.jar不需要作为classpath上的 ,但你仍然需要它在某处,以便你可以使用-javaagent JVM标志指向它,如下所示: -javaagent:full\path\of\spring-instrument-3.1.2.RELEASE.jar 我在Eclipse Juno工作,所以为了设置这个,我去了Window – > Preferences – > Java – > Installed JREs。 然后我在列表框中单击选中的JRE,然后单击列表框右侧的“编辑…”按钮。 生成的弹出窗口中的第三个文本框标记为“默认VM参数:”。 这是应该键入-javaagent标志或复制+粘贴的位置。 现在我的实际测试代码类。 首先,我的主要类TestMain.java : package my.package; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestMain […]

Spring AOP:如何获取建议方法的注释

我想用Spring / AOP和注释实现声明性安全性。 正如您在下一个代码示例中所看到的,我使用了限制注释和参数“allowedRoles”来定义允许执行建议方法的人员。 @Restricted(allowedRoles=”jira-administrators”) public void setPassword(…) throws UserMgmtException { // set password code … } 现在,问题是在我的建议中我无法访问已定义的注释: public Object checkPermission(ProceedingJoinPoint pjp) throws Throwable { Signature signature = pjp.getSignature(); System.out.println(“Allowed:” + rolesAllowedForJoinPoint(pjp)); … } private Restricted rolesAllowedForJoinPoint(ProceedingJoinPoint thisJoinPoint) { MethodSignature methodSignature = (MethodSignature) thisJoinPoint.getSignature(); Method targetMethod = methodSignature.getMethod(); return targetMethod.getAnnotation(Restricted.class); } 上面的方法总是返回null(根本没有找到注释)。 有一个简单的解决方案吗? 我读了一些关于使用AspectJ代理的内容,但我不想使用这个代理。

Spring @Transactional方法 – 参与交易

在一个道具我有2个@Transactional方法。 如果我不提供任何明确的属性, 那么会发生什么,如果 我在另一个体内运行一种方法? 这两种方法都在同一个交易中运行?

带注释的类中带注释的方法或方法的切入点

我需要使用@X注释的类中的方法或使用@X注释的方法的切入点 。 我还需要注释对象 。 如果类和方法都被注释, 我更喜欢将方法注释作为参数 。 我尝试了以下操作,这会产生“不一致的绑定”警告。 (为什么不将它们设置为null?) @Around(“@annotation(methodLevelX) || @within(classLevelX)”) public Object advise(ProceedingJoinPoint pjp, X methodLevelX, X classLevelX) 以下内容创建了“参数(x)跨越’||’的模糊绑定 在切入点“警告。 (在我看来,这不一定有意义:为什么不绑定第一个短路评估?) @Around(“@annotation(x) || @within(x)”) public Object advise(ProceedingJoinPoint pjp, X x) 如果存在类和方法注释,则将先前的尝试拆分为两个自然会导致两个方法调用。 我知道我可以通过这样的切入点获得带有reflection的方法和类以及我想要的注释: @Around(“@annotation(com.package.X) || @within(com.package.X)”) 但我不愿意。 有没有“一个切入点,一个方法,一个注释参数”,我的要求的解决方案不需要反思?

使用Spring AOP记录好主意吗?

我现在正在阅读Spring,其中一个用于使用AOP的示例是记录方法调用的开始和结束。 我还读到使用AOP会影响性能。 对于这种类型的日志记录,使用Spring AOP是个好主意吗? 我的理解是Spring使用Dynamic AOP会更好地将静态AOP(如AspectJ)用于这种类型的AOP。 当然,我工作的公司的编码策略需要大量的日志记录,我希望减少我必须编写的日志代码的数量,并提高代码的可读性。 我吠叫错了树吗?

使用Spring AOP && MVC订购方面

我正在尝试使用Spring AOP和Spring MVC Controller。 我有3个方面,并希望按特定顺序。 为了做到这一点,我使用Ordered接口并实现getOrder方法: @Aspect @Component public class LoggingAspect implements Ordered{ public int getOrder() { System.out.println(“Abra”); return 1; } 建议课程: @Component @Controller public class HomeController { 切入点: @Aspect public class SystemArchitecture { @Pointcut(“execution (* com.jajah.StorageManager.HomeController.*(..))”) public void inHomeController(){} @Pointcut(“execution (* com.jajah.StorageManager.HomeController.*(..))”) public void loggable(){} @Pointcut(“execution (* com.jajah.StorageManager.HomeController.*(..))”) public void authenticated(){} } 组态: <!– […]