spring-aop 相关问题

Spring AOP是Spring Framework的AOP版本,使用纯Java实现并使用AspectJ项目中的@AspectJ注释。 Spring AOP通过动态JDK或CGLib代理工作。

Spring Boot 中实体的面向方面扩展

我有一个 Spring Boot 2.7.6 应用程序。我有一些通过各种 Mongo 存储库管理的实体。我想用元数据扩展我的实体。所以我想我应该构建一个元数据

回答 1 投票 0

Springboot AOP 与 java && kotlin 和 Gradle - 它不起作用

我是一名学生,正在做一个Java + Spring Boot项目,我把Controller部分改成了Kotlin!然而我测试的时候,所有使用@Before Aop的API在调用服务f时都会生成NPE...

回答 1 投票 0

Spring 使用 CGlib 创建代理,尽管类实现了多个接口

在我的应用程序中,我有一个实现接口 A 和接口 B 的类 X。我使用 Spring AOP 和 AspectJ 实现了一个方面,并在接口 A 的每个方法上都有一个切入点。 同时

回答 1 投票 0

“干净地”将接口/类附加到任何类

给定一个任意的 POJO 类,我想拦截所有 setter 并在每个实例的基础上做一些“神奇的事情”。很自然地,我想到了AspectJ/AOP。 我定义了一个标记注释 我

回答 1 投票 0

简单的Spring AOP,但Aspect不会被触发

我正在尝试练习 Spring AOP。问题是,我的程序不是我所期望的。 当 Aspect 工作时,它应该看起来像这样。 2020 年 9 月 27 日 1:11:11 PM 方面。LoggingAspect 日志 信息:我...

回答 1 投票 0

在 Spring AOP 6.1+ 中访问 Groovy 类的方法参数名称时出现问题

自 6.1 起 》参数名称保留 LocalVariableTableParameterNameDiscoverer 已在 6.1 中删除。” 即使在 java 编译器中使用 -parameters,我们也不再能够做这样的事情......

回答 1 投票 0

Spring Framework 6.1+ 和 AOP 注解以及访问方法中的参数和值

自 6.1 起 》参数名称保留 LocalVariableTableParameterNameDiscoverer 已在 6.1 中删除。” 即使在 java 编译器中使用 -parameters,我们也不再能够做这样的事情......

回答 1 投票 0

Spring 事务自注入

在 Spring 中,由于 AOP 代理的原因,你不能简单地从同一个实例调用 @Transactional 方法。进行自我注入并从自我代理实例调用该方法是个好主意吗...

回答 1 投票 0

使用Java配置分配Spring代理

我有这段代码 我有这段代码 <bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean" p:target-ref="john" p:interceptorNames-ref="advisorNames"> </bean> <bean id="documentarist" class="com.aop.declarative.Documentarist" p:guitarist-ref="proxy" /> 我想使用 Java Config 进行类似的配置。 @Bean public ProxyFactoryBean factoryBean() { ProxyFactoryBean factoryBean = new ProxyFactoryBean(); factoryBean.setTarget(guitarist()); factoryBean.setProxyTargetClass(true); factoryBean.addAdvisor(pointcutAdvisor()); return factoryBean; } @Bean public Documentarist documentarist() { Documentarist documentarist = new Documentarist(); documentarist.setGuitarist(guitarist()); return documentarist; } 在这行代码中 documentarist.setGuitarist(guitarist()); 而不是吉他手(),我想使用 factoryBean() 以便像我们在 xml 中所做的那样注入代理吉他手。我们如何使用 Java 配置来做到这一点? 经过实验,这是我找到的解决方案。 documentarist.setGuitarist((Guitarist) factoryBean().getObject()); 因为 ProxyFactoryBean 实现了 FactoryBean,所以它的 getObject() 返回被代理的对象。因为它返回 Object,所以它被转换为正确的类型。

回答 1 投票 0

AOP 日志记录带来的开销

我计划记录 REST API 的所有方法的执行时间。为了实现这一点,我使用 AOP,如下所示: @方面 @成分 @Slf4j @ConditionalOnExpression("${aspect.enabled:true}")

回答 1 投票 0

Springboot中除了AOP之外还有什么有效的方式来记录执行时间?

我计划记录 REST API 的所有方法的执行时间。为此,我使用了 AOP,如下所示: @方面 @成分 @Slf4j @ConditionalOnExpression("${

回答 1 投票 0

如何在另一个Spring项目中使用在第一个Spring项目中创建的带有aspectj @Aspect的注释?

我使用aspectj Aspect 创建了一个名为@ProjectAudit 的注释。我在名为projectaudit的maven项目中做到了这一点。 我的 ProjectAudit 注释是: 包com.example; 导入java.lang.annota...

回答 1 投票 0

为什么“Save方法”被拦截了,而“findAll”没有被拦截

问题很简单 @Around("执行(* package.*Repository.save(..))") 公共对象 saveInterupt(ProceedingJoinPoint joinPoint) 抛出 Throwable { // 每当

回答 3 投票 0

Save方法被拦截但findAll未被拦截

问题很简单 @Around("执行(* package.*Repository.save(..))") 公共对象 saveInterupt(ProceedingJoinPoint joinPoint) 抛出 Throwable { // 每当

回答 3 投票 0

为什么 Spring-AOP 切入点对 save(..) 有效,但对 saveAll(..) 无效

我有一个像这样的Spring数据存储库: 包 com.example.demo; @RepositoryRestResource 公共接口 FooRepository 扩展 JpaRepository { @覆盖 我有一个像这样的 Spring-Data 存储库: package com.example.demo; @RepositoryRestResource public interface FooRepository extends JpaRepository<Foo, Long> { @Override <S extends Foo> S save(S entity); @Override <S extends Foo> List<S> saveAll(Iterable<S> entities); } 还有这样的一个方面: @Aspect @Component public class FooAspect { @Before("execution(* org.springframework.data.repository.CrudRepository.save(*))") void crudSaveBefore(JoinPoint joinPoint) throws Throwable { System.out.println("crud save"); } @Before("execution(* com.example.demo.FooRepository.save(*))") void fooSaveBefore(JoinPoint joinPoint) throws Throwable { System.out.println("foo save"); } @Before("execution(* org.springframework.data.repository.CrudRepository.saveAll(*))") void crudSaveAll(JoinPoint joinPoint) throws Throwable { System.out.println("crud save all"); } @Before("execution(* com.example.demo.FooRepository.saveAll(*))") void fooSaveAll(JoinPoint joinPoint) throws Throwable { System.out.println("foo save all"); } } 当我运行 fooRepository.save(..) 时,在控制台中我看到: foo save 当我运行 fooRepository.saveAll(..) 时,在控制台中我看到 foo save all 和 crud save all 我期望 saveAll 只拦截 FooRepository 风味,因为我直接切点 package.class.method 。这似乎对 save 有效,但对 saveAll 无效。 这是因为saveAll中的参数是Iterable吗?或者泛型在这里发生某种类型擦除?还有别的吗? 看来是AOP问题。对于代理 FooRepository.saveAll,它调用 CrudRepository.saveAll @Before 表达式: AbstractAspectJAdvice 683 由于我遇到了类似的话题,我正在重新审视这个问题。我希望迟到的答复总比没有好。 我期望 saveAll 只拦截 FooRepository 风味,因为我直接切点 package.class.method 。这似乎对 save 有效,但对 saveAll 无效。 令我感到相当惊讶的是,并非所有 4 个切入点都匹配。令人困惑的问题是为什么 execution(* org.springframework.data.repository.CrudRepository.save(*)) 不匹配。我已经发现,这个问题不是由 Spring AOP 本身引起的,而是在本机 AspectJ 中表现出来。在那里,切入点也不匹配。 作为解决方法,更改切入点以使用 + 显式包含子类或实现接口的类: execution(* org.springframework.data.repository.CrudRepository+.save(*)) 现在,所有 4 个切入点都匹配,这也是说明原因的线索。 事实上 + 有帮助,意味着 AspectJ 切入点匹配器正确识别我们正在处理接口方法,并且 save 是跨层次结构继承的。与 saveAll 的区别在于类型擦除。没有泛型的saveAll看起来像List saveAll(Iterable),这与原始接口相同,而对于save来说,接口中的Object save(Object)与实现类中的Foo save(Foo)更多。也就是说,方法签名不直接匹配接口的签名,这就是为什么我们需要告诉 AspectJ 在匹配时也检查继承。 这并不是 AspectJ 中的错误,而是其在泛型类型和类型擦除方面的使用中的微妙之处。 saveAll 匹配的事实只是一个“幸运的机会”,因为在返回类型和方法参数中我们都使用特定类型,而泛型仅适用于这些类型的类型参数。然而,在 save 中,泛型类型直接按擦除方式使用。 反汇编类证实了我上面解释的内容: public abstract interface org/springframework/data/repository/CrudRepository implements org/springframework/data/repository/Repository { // ... // signature <S:TT;>(TS;)TS; // declaration: S save<S extends T>(S) public abstract save(Ljava/lang/Object;)Ljava/lang/Object; // ... // signature <S:TT;>(Ljava/lang/Iterable<TS;>;)Ljava/lang/Iterable<TS;>; // declaration: java.lang.Iterable<S> saveAll<S extends T>(java.lang.Iterable<S>) public abstract saveAll(Ljava/lang/Iterable;)Ljava/lang/Iterable; // ... } class FooRepositoryImpl implements FooRepository { // ... // signature <S:LFoo;>(TS;)TS; // declaration: S save<S extends Foo>(S) public save(LFoo;)LFoo; // ... // signature <S:LFoo;>(Ljava/lang/Iterable<TS;>;)Ljava/util/List<TS;>; // declaration: java.util.List<S> saveAll<S extends Foo>(java.lang.Iterable<S>) public saveAll(Ljava/lang/Iterable;)Ljava/util/List; // ... }

回答 2 投票 0

如何动态配置Spring AOP

现在程序运行时需要向spring容器中添加一个bean。这个bean就是spring AOP的配置类。如何让配置生效。 我知道@

回答 1 投票 0

如何使用AOP(@Around注解)拦截kafka消息,并使用@KafkaListener注解进行监听

我正在将我的 spring-boot 应用程序从 spring-boot 2.7.x 升级到 3.2.x。在 spring-boot 2.7.x 中,我使用 @StreamListener 来监听来自 kafka 的消息,但在给予控制权之前...

回答 1 投票 0

AOP 建议未在 Spring Boot 应用程序中运行

我正在尝试在我的应用程序中使用简单的日志记录方面,但建议没有运行,并且在控制台中没有收到任何日志。 添加了依赖项 - 我正在尝试在我的应用程序中使用简单的日志记录方面,但建议没有运行,并且在控制台中没有收到任何日志。 添加了依赖项- <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> </dependency> 实体类- package com.ayushsingh.aopproject.entity; import org.springframework.stereotype.Component; @Component public class Student { private Long id; private String name; private String address; private Integer age; private Long phone; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Long getPhone() { return phone; } public void setPhone(Long phone) { this.phone = phone; } } 方面类- package com.ayushsingh.aopproject.aop; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Aspect @Component public class LoggingAspect { LoggingAspect() { System.out.println("Logging Aspect instansiated"); } // -Run before a getter @Before("execution(public String com.ayushsingh.aopproject.entity.Student.getName())") public void LoggingAdvice1() { System.out.println("Advice 1"); } // - Run before a method of a particular class @Before("execution(public String com.ayushsingh.aopproject.entity.Student.getName())") public void LoggingAdvice2() { System.out.println("Adivce 2"); } // - Run before all getters @Before("execution(public String com.ayushsingh.aopproject.*.get*())") public void LoggingAdvice3() { System.out.println("Advice 3"); } // - Run before all setters (methods with argument) @Before("execution(public void com.ayushsingh.aopproject.*.set*(*))") // -one or more arguments public void LoggingAdvice4() { System.out.println("Advice 4"); } // -for getters of all entity classes in the entity package @Before("execution(public * com.ayushsingh.aopproject.entity.*.get*())") public void LoggingAdvice5() { System.out.println("Advice 5"); } } 主课- package com.ayushsingh.aopproject; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.EnableAspectJAutoProxy; import com.ayushsingh.aopproject.entity.Student; @SpringBootApplication @EnableAspectJAutoProxy public class AopProjectApplication implements CommandLineRunner { public static void main(String[] args) { SpringApplication.run(AopProjectApplication.class, args); } @Override public void run(String... args) throws Exception { // -Create Student object Student student = new Student(); student.setId(1L); student.setAddress("Address 1"); student.setAge(25); student.setName("Ayush"); student.setPhone(8145000047L); String name=student.getName(); System.out.println("Name: " + student.getName()); } } 现在在运行应用程序时,我还必须从建议中获取日志,但由于我还使用调试器和断点进行了检查,因此这些方面根本没有运行。 我得到的输出是- 2024-02-07T15:20:41.325+05:30 INFO 21704 --- [ restartedMain] c.a.aopproject.AopProjectApplication : No active profile set, falling back to 1 default profile: "default" 2024-02-07T15:20:41.408+05:30 INFO 21704 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable Logging Aspect instansiated 2024-02-07T15:20:42.527+05:30 INFO 21704 --- [ restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 2024-02-07T15:20:42.607+05:30 INFO 21704 --- [ restartedMain] c.a.aopproject.AopProjectApplication : Started AopProjectApplication in 1.732 seconds (process running for 2.185) Name: Ayush 请帮我解决这个问题。 不要直接调用组件构造函数,让 Spring 容器通过在 getBean(..) 返回的应用程序上下文上调用 SpringApplication.run()(当前已被您丢弃)来为您完成此操作。 还建议您在使用新技术时至少阅读最少的文档,或者可以从功能示例应用程序开始,逐步了解更多功能,始终只更改一些小部分,如果某些功能不起作用,您可以恢复这些内容。

回答 1 投票 0

强制使用 org.springframework.aop.framework.CglibAopProxy$DynamicUnadvisedInterceptor 的最佳方法是什么?

我有一个高度并发的基于 Spring 的 Web 应用程序,其中每个请求都会生成数百个线程,每个线程都想要访问单例 bean 和请求范围的 bean。我们看到了瓶颈

回答 1 投票 0

如何在java中使单例bean线程安全并具有更好的性能?

我正在尝试与多个用户测试下面的代码。但是由于该类是由 spring 管理的单例,因此只有一个已创建的对象,并且多个线程试图访问该对象......

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.