Tag: spring aop

Spring Data Rest Override存储库(控制器与AOP)

域/库 Project { User owner; } //Querydsl repositories @RepositoryRestResource public interface ProjectRepository extends PagingAndSortingRepository, QueryDslPredicateExecutor, QuerydslBinderCustomizer { default void customize(QuerydslBindings bindings, QProject project) { (…) } } Requeriment:根据经过身份validation的用户上下文过滤数据: 如果用户是ROLE_PUBLIC根据predicate显示项目,并且用户是owner 。 如果用户是ROLE_ADMIN根据predicatefilter显示项目。 我尝试解决了几个替代方案: 选项1 :覆盖@RepositoryRestController如Spring DATA REST doc所述: @RepositoryRestController public class ProjectController { @RequestMapping(value = “/projects”, method = RequestMethod.GET) @ResponseBody public PagedResources search( @QuerydslPredicate(root=Project.class ,bindings =ProjectRepository.class) […]

在Spring AOP介绍中丢失了原始界面

这是我的Spring AOP配置。 ApplicationContext context = new ClassPathXmlApplicationContext(“myApp.xml”); Object myObject = context.getBean(“myObject”); if (myObject instanceof OriginalClass) { System.out.println(“This is OriginalClass”); } if(myObject instanceof IntroducedInterface) { System.out.println(“This is IntroducedInterface”); } 通过这个介绍,我能够调用IntroducedInterface中的方法。 但是,我无法访问OriginalClass的方法。 在上面的代码片段中,我从未打印出’This is OriginalClass’。 根据“简介”的定义,我理解实现新接口的代理将从OriginalClass扩展并使其’方法也可访问。 我在这里错过了什么吗? 有人可以解释一下原因吗? PS:以下是Spring in Action(第3版)中描绘的图片。

如何分离业务逻辑和电子邮件发送function?

我的java web应用程序中有一个要求,我需要在某些条件下发送电子邮件警报。 为此,我使用了javax mail api并发送电子邮件工作正常。 但问题是程序执行等待直到执行发送电子邮件的方法。 由于在不同的点上发送了数百封电子邮件……这会显着降低性能。 我正在使用弹簧,也使用了弹簧。 任何人都可以建议我如何分离我的业务逻辑和发送电子邮件function。 它应该像 – 发送电子邮件是我的建议,在调用xyz方法时执行 – 所以主要执行不应该等待建议完成其执行,而应该返回并执行进一步的业务逻辑,从而单独执行电子邮件发送。 这里创建新线程似乎是明显的选择。 但我认为可能有更好的方法,是吗? 谢谢。

AOP使用Around来避免执行方法

我在我的代码中使用Spring AOP来拦截某个方法的执行。 我正在尝试做的一个简化示例如下: public void someMethod() { //does something } @Around(“execution( someMethod())”) public void anotherMethod(final ProceedingJoinPoint joinPoint) { //i want to add this to a queue to get executed later on addToWaitList(new Callable() { @Override public call() throws Exception { joinPoint.proceed(); } }); return; } 本质上,我想推迟someMethod()的执行,直到它位于列表的头部。 但是,主线程阻塞,即使我在anotherMethod()的末尾返回,所以我无法将new Callable添加到列表中,直到第一个完成执行。 文档说您可以通过返回自己的返回值或抛出exception来快速建议的方法执行。 我不想抛出exception而且我不确定在这种情况下“返回自己的返回值”意味着什么。 我希望能够使用主线程将Callables添加到列表中,然后让其他线程池执行它们。

使对象弹簧管理

如何管理已存在的对象弹簧? 我想使用aspectj将它连接到Springs AoPfunction。 我知道这是一个挑战,因为Spring AoP使用可能与对象一起创建的动态代理。 我为什么需要这个? 我有一个第三方类,它接受一个只在运行时知道的构造函数参数,因此我似乎无法将它添加到我的applicationContext或使用spring FactoryBean接口进行构造。 还有别的办法吗? 我已经尝试了以下但没有取得很大的成功: Obj obj = new ThirdPartyObj(“runtime constructor arg”); appContext.getAutowireCapableBeanFactory().initializeBean(obj, “Obj”); 它可能是弹簧管理的,但我仍然不能用它来触发方面。 [编辑] axtavt指出问题是我不使用从initializeBean(..)返回的对象。 提到的两种方法都有效,但前提是: 使用接口ObjInterface obj = (ObjInterface) ac.getBean(“obj”, args); 或者我们会得到一个: java.lang.ClassCastException: $Proxy28 cannot be cast to com.company.Obj 不使用接口但启用CGLIB 。 这需要一个非私有的默认构造函数,否则我们将获得: java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given

SpringAOP与AspectJ的介绍

我是SpringAOP的新手。 我想写一些简单的介绍示例,但无法清楚地了解它必须如何工作。 在文档中我发现: 简介:代表类型声明其他方法或字段。 Spring AOP允许您向任何建议的对象引入新接口(和相应的实现)。 例如,您可以使用简介使bean实现IsModified接口,以简化缓存。 (引言在AspectJ社区中称为类型间声明。) 我写了一个简单的例子:我用一个方法编写简单的类 public class Test { public void test1(){ System.out.println(“Test1”); } } 然后我编写实现此接口的接口和类 public interface ITest2 { void test2(); } public class Test2Impl implements ITest2{ @Override public void test2() { System.out.println(“Test2”); } } 最后我的方面 @Aspect public class AspectClass { @DeclareParents( value = “by.bulgak.test.Test+”, defaultImpl = Test2Impl.class ) public […]

AOP Spring @AfterReturning无法按预期工作

我正在学习AOP spring并尝试一些例子。 关于@ AfterReturning,我所理解的是只有在目标成功返回并且与切入点匹配时才调用该方法。 但是在我的情况下如下所示,我有一个切入点,它定义了只返回String的所有方法,但是它调用所有的void方法以及返回String的方法。 我的建议: @AfterReturning(value= “execution(* com.aop..CustomerServiceImpl.*(..))”, returning= “string”) public void returnStringPointcut(JoinPoint joinPoint,String string){ System.out.println(“logAfter() is running!”); System.out.println(“String : ” + string); System.out.println(“hijacked : ” + joinPoint.getSignature().getName()); System.out.println(“******”); } 请在下面找到我的Impl课程: public void addCustomer() { // TODO Auto-generated method stub } public String getCustomer() { // TODO Auto-generated method stub return “string”; } public […]

什么是为Spring AOP注入相同服务实例的最佳方式

我是一个使用Spring的@Service构造型注释的ServiceImpl,并且有两个方法,每个方法都使用Spring拦截的自定义注释进行注释。 @Service public class ServiceImpl implements Service{ @CustomAnnotation public void method1(){ … } @AnotherCustomAnnotation public void method2(){ this.method1(); … } } } 现在Spring使用基于代理的AOP方法,因此当我使用this.method1()拦截器@CustomAnnotation将无法拦截此调用时,我们曾经在另一个FactoryClass中注入此服务,这样我们就能够获得代理实例如 – @AnotherCustomAnnotation public void method2(){ someFactory.getService().method1(); … } 我现在使用Spring 3.0.x,这是获取代理实例的最佳方法吗?

有人可以解释这个和目标切入点指示符

我是Spring AOP的新手,正在阅读切入点指示符的文档。 这个和目标指示符对我来说都是一样的。 有人可以用更好/更清洁的例子来解释吗? 谢谢 this – 限制匹配连接点(使用Spring AOP时执行方法),其中bean引用(Spring AOP代理)是给定类型的实例 eg: this(com.xyz.service.AccountService) 代理实现AccountService接口的任何连接点(仅在Spring AOP中执行方法): target – 限制匹配到连接点(使用Spring AOP时执行方法),其中目标对象(被代理的应用程序对象)是给定类型的实例 eg: target(com.xyz.service.AccountService) 目标对象实现AccountService接口的任何连接点(仅在Spring AOP中执行方法) 链接: http : //docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/aop.html

为什么/如何得到错误:NoClassDefFoundError:org / springframework / aop / framework / ProxyFactory

目标:启动一个支持远程访问方法调用的服务器。 在创建所有服务之后,应用程序不会失败。 jar位于target / lib目录中。 父pom具有依赖性: org.springframework spring-aop ${version.spring} 注意:我能够创建一个类型为:org.springframework.aop.framework.ProxyFactory的spring bean 堆栈跟踪: 36438 [main] ERROR org.springframework.web.context.ContextLoader – 上下文初始化失败 org.springframework.beans.factory.BeanCreationException:在类路径资源[application-context-service-web-server.xml]中定义名称为’org.springframework.remoting.rmi.RmiServiceExporter#0’的bean时出错:init的调用方法失败; 嵌套exception是java.lang.NoClassDefFoundError:org / springframework / aop / framework / ProxyFactory 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1338) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory $ 1.run(AbstractAutowireCapableBeanFactory.java:409) at java.security.AccessController.doPrivileged(Native Method) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) 在org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:264) 在org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 在org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261) 在org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185) 在org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429) 在org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728) 在org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380) 在org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255) 在org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199) 在org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45) 在org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3795) 在org.apache.catalina.core.StandardContext.start(StandardContext.java:4252) 在org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:760) 在org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:740) […]