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

这篇文章主要介绍了解决spring boot启动扫描不到自定义注解的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

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

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

注解实现类

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

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

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

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

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

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...