解决spring boot启动扫描不到自定义注解的问题

对于自定义注解这里就不唠叨了,百度一大堆,这里有我一个自定义注解

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD })
public @interface MsgEvent {
  RetailOrderEvent msgEvent();
}

注解实现类

@Component
public class MsgEventProcessor implements BeanPostProcessor {
  /**
   * 事件消息注解与实例Bean的映射对象
   */
  public static Map<String, ServiceBean> EVENTCODESERVICEBEANMAP = new HashMap<String, ServiceBean>();

  @Override
  public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    return bean;
  }

  @Override
  public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    Method[] methods = ReflectionUtils.getAllDeclaredMethods(bean.getClass());
    if (methods != null) {
      for (Method method : methods) {
        MsgEvent myMsgEvent = AnnotationUtils.findAnnotation(method, MsgEvent.class);
        if (myMsgEvent != null) {
          String eventCode = myMsgEvent.msgEvent().eventCode();
          ServiceBean servieBean = new ServiceBean();
          servieBean.setServiceBeanObj(bean);
          servieBean.setServiceMethod(method);
          Class<?> argsCls = method.getParameterTypes()[0];
          servieBean.setArgsCls(argsCls);
          EVENTCODESERVICEBEANMAP.put(eventCode, servieBean);
        }
      }
    }
    return bean;
  }
}

调用者

@MsgEvent(msgEvent = RetailOrderEvent.PLACE_GENERALRETAILORDER)
  public Person getPerson(Person p) {
    return personMapper.getPerson(p.getId());
  }

spring boot debug模式下启动一直不会再代码红色部分停下,说明没有获取到自定义注解

原因是发现bean为jdk代理

解决办法

@SpringBootApplication
@EnableAspectJAutoProxy(exposeProxy = true)
public class Application {

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}

或者

@ImportResource(locations = { "classpath:spring-basic.xml" })
@SpringBootApplication
//@EnableAspectJAutoProxy(exposeProxy = true)
public class Application {

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}

spring-basic.xml

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
  http://www.springframework.org/schema/context
  http://www.springframework.org/schema/context/spring-context-3.1.xsd
  http://www.springframework.org/schema/aop
  http://www.springframework.org/schema/aop/spring-aop-3.1.xsd ">

  <!-- 配置使Spring采用CGLIB代理 -->
  <aop:aspectj-autoproxy expose-proxy="true" proxy-target-class="true" />
</beans>

上述会让所有的都采用CGLIB代理,如果只想对使用的类采用,其他的还是原来的话就可以对注解使用类上标注@Configuration代替@Component

补充知识:解决Aspect注解基于注解的增强不生效的问题

Aspect基于注解的增强生效须满足3个条件:

<!--1.代理方式设置为 cglib,默认false,则必须通过实现某个接口才能实现增强 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>
<!--2.配置文件中把须增强注解所在包扫描注入,或者配置 bean-->
<context:component-scan base-package="注解所在包路径"/>
<!--3.配置文件中把@Aspect注解所在类对应包扫描注入 或者配置bean-->
<context:component-scan base-package="aspect注解所在包路径"/>

ps : 若在 controller 层使用,则controller 也需要配置上边两个条件方能生效

以上这篇解决spring boot启动扫描不到自定义注解的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Springmvc如何返回xml及json格式数据

    问:@ResponseBody注解怎么指定返回xml 还是json 答:@RequestMapping 的produces 属性指定 produces = "application/xml" 或者 produces = "application/json" 返回xml 文件编码是utf-8,需要以下这么写,否则乱码 @RequestMapping(value = "/rss", produces = "application/xml;c

  • 简单了解SpringMVC全局异常处理常用方法

    项目中,可能会抛出多个异常,我们不可以直接将异常的堆栈信息展示给用户,有两个原因: 用户体验不好 非常不安全 所以,针对异常,我们可以自定义异常处理,SpringMVC 中,针对全局异常也提供了相应的解决方案,主要是通过 @ControllerAdvice 和@ExceptionHandler 两个注解来处理的. 以上传大小超出限制为例,自定义异常,只需要提供一个异常处理类即可: @ControllerAdvice//表示这是一个增强版的 Controller,主要用来做全局数据处理 publi

  • Spring MVC 更灵活的控制 json 返回问题(自定义过滤字段)

    这篇文章主要讲 Spring MVC 如何动态的去返回 Json 数据 在我们做 Web 接口开发的时候, 经常会遇到这种场景. 两个请求,返回同一个对象,但是需要的返回字段并不相同.如以下场景 /** * 返回所有名称以及Id */ @RequestMapping("list") @ResponseBody public List<Article> findAllNameAndId() { return articleService.findAll(); } /** *

  • 解决spring boot启动扫描不到自定义注解的问题

    对于自定义注解这里就不唠叨了,百度一大堆,这里有我一个自定义注解 @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.METHOD }) public @interface MsgEvent { RetailOrderEvent msgEvent(); } 注解实现类 @Component public class MsgEventProcessor implements BeanPostProcessor { /** * 事件消息

  • 解决Spring Boot 正常启动后访问Controller提示404问题

    问题描述 今天重新在搭建Spring Boot项目的时候遇到访问Controller报404错误,之前在搭建的时候没怎么注意这块.新创建项目成功后,作为项目启动类的Application在com.blog.start包下面,然后我写了一个Controller,然后包的路径是com.blog.ty.controller用的@RestController 注解去配置的controller,然后路径也搭好了,但是浏览器一直报404.最后找到原因是Spring Boot只会扫描启动类当前包和以下的包 ,

  • 解决Spring boot 嵌入的tomcat不启动问题

    此文章记录一次spring boot通过main 方法启动无法成功的问题 Unregistering JMX-exposed beans on shutdown 问题如下,因为已经解决用的别人的截图但是效果是一样的 百度了一圈都说tomcat没有配置,但实际xml有如下配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomc

  • 解决Spring Boot 多模块注入访问不到jar包中的Bean问题

    情景描述 一个聚合项目spring-security-tutorial,其中包括4个module,pom如下所示: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://mav

  • Spring Boot启动流程分析

    引言 早在15年的时候就开始用spring boot进行开发了,然而一直就只是用用,并没有深入去了解spring boot是以什么原理怎样工作的,说来也惭愧.今天让我们从spring boot启动开始,深入了解一下spring boot的工作原理. 为什么用spring boot 在使用一个东西或者一个工具之前,我们总是会问自己,我为什么要用?用他能给我带来什么好处? * 最大的好处就是spring boot遵从了java**约定大于配置**不用面对一大堆的配置文件,spring boot是根据

  • 如何在Spring Boot启动时运行定制的代码

    Spring Boot会自动为我们做很多配置,但迟早你需要做一些自定义工作.在本文中,您将学习如何挂钩应用程序引导程序生命周期并在Spring Boot启动时执行代码. 1.执行bean初始化的方法 Spring启动应用程序后运行某些逻辑的最简单方法是将代码作为所选bean引导过程的一部分来执行. 只需创建一个类,将其标记为Spring组件,并将应用程序初始化代码放在带有@PostConstruct注释的方法中.理论上,您可以使用构造函数而不是单独的方法,但将对象的构造与其实际责任分开是一种很好

  • 解决Spring Boot 在localhost域奇怪的404问题(Mac book pro)

    在mac系统中,明明url是对的,浏览器也可以打开,一个简单的代码调用就是404,你有没有遇到过? 情景再现 普通的一个controller,返回一个常量. @GetMapping("/project_metadata/spring-boot") public String getMetadata(){ return "{\"data\":1234}";//这个不重要 } 调用接口的方式: content = new JSONObject(res

  • Spring Boot启动过程(六)之内嵌Tomcat中StandardHost、StandardContext和StandardWrapper的启动教程详解

    StandardEngine[Tomcat].StandardHost[localhost]的启动与StandardEngine不在同一个线程中,它的start: // Start our child containers, if any Container children[] = findChildren(); List<Future<Void>> results = new ArrayList<>(); for (int i = 0; i < childre

  • spring boot启动加载数据原理分析

    实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求. 为了解决这样的问题,spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来实现. 创建实现接口 CommandLineRunner 的类,通过@Component注解,就可以实现启动时加载数据项.使用@Order 注解来定义执行顺序. IndexStartupRunner.Java类: import org.springframework.boot.CommandLine

  • Spring Boot启动过程完全解析(二)

    上篇给大家介绍了Spring Boot启动过程完全解析(一),大家可以点击参考下 该说refreshContext(context)了,首先是判断context是否是AbstractApplicationContext派生类的实例,之后调用了强转为AbstractApplicationContext类型并调用它的refresh方法.由于AnnotationConfigEmbeddedWebApplicationContext继承自EmbeddedWebApplicationContext,所以会

随机推荐