首页 > 解决方案 > @Aspect 不适用于“registerBeanDefinition”的动态 bean 注册

问题描述

我使用“registerBeanDefinition”注册了一个 bean,但方面在这个 bean 上不起作用。

/* tool class */
@Component
public class SpringBeanUtil {
    public <T> T getBean(Class<T> clazz){
        BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(clazz);
        DefaultListableBeanFactory beanFactory = 
        (DefaultListableBeanFactory)configurableApplicationContext.getBeanFactory();

        beanFactory.registerBeanDefinition(clazz.getName(), builder.getRawBeanDefinition());

        Object bean = configurableApplicationContext.getBean(clazz.getName());
        return (T) bean;
}

/* my class */
public class ResourceHandle{
    public ResourceHandle() {}

    @WorkFlow
    public void create(Resource rc) {
        System.out.println("ResourceHandle:create:{}.", rc)
        return;
    }
}

/* annotation class */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WorkFlow {
    String name() default "";
}


/* aspcet class */
@Component
@Aspect
public class WorkFlowAspect {

    @Pointcut("@annotation(com.workflow.WorkFlow)")
    public void cutAction() {
    }

    @Around(value = "@annotation(com.workflow.WorkFlow)")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        Resource retResource = null;
        retResource = (Resource)joinPoint.proceed();
        return retResource;
    }
}

我调用这样的代码,

ResourceHandle handle = SpringBeanUtil.getBean(ResourceHandle.class);
handle.create(rc);

@Aspect“doAround”不起作用。但是当我将“ResourceHandle 类”更改为:

/* my class */
@Component
public class ResourceHandle{
    public ResourceHandle() {}

    @WorkFlow
    public void create(Resource rc) {
        System.out.println("ResourceHandle:create:{}.", rc)
        return;
    }
}

像这样调用代码,

@Autowired
ResourceHandle handle;
........
handle.create(rc);

@Aspect“doAround”工作。但我想自己创建bean。我该怎么做?

标签: spring-boot

解决方案


推荐阅读