当前位置: 首页 > 知识库问答 >
问题:

是否有“恢复”到Spring@Dependson注释?

晋鹤轩
2023-03-14
@Component("beana")
public class BeanA{

    @PostConstruct
    void init(){
       // do smth
    }
}

@Component("beanb")
@DependsOn("beana")
public class BeanB{

    @PostConstruct
    void init(){
       // do smth
    }
}
@Component("beana")
@RequiredBy("beanb") 
public class BeanA{

    @PostConstruct
    void init(){
       // do smth
    }
}

@Component("beanb")
public class BeanB{

    @PostConstruct
    void init(){
       // do smth
    }
}

共有1个答案

聂宜
2023-03-14

我相信没有开箱即用的spring注释,但您可以轻松地制作自己的注释。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface RequiredBy {
    String[] value();
}

然后可以遍历所有bean定义,并将dependsOn设置为requiredbean。

@Component
public static class RequiredByBeanDefinitionPostProcessor implements BeanDefinitionRegistryPostProcessor {

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        for (String beanName : registry.getBeanDefinitionNames()) {
            final BeanDefinition beanDefinition = registry.getBeanDefinition(beanName);
            if (beanDefinition.getBeanClassName() == null) {
                continue;
            }
            try {
                final Class<?> beanClass = Class.forName(beanDefinition.getBeanClassName());
                if (beanClass.isAnnotationPresent(RequiredBy.class)) {
                    final String[] dependantBeanNames = beanClass.getAnnotation(RequiredBy.class).value();
                    for (String dependantBeanName : dependantBeanNames) {
                        BeanDefinition dependantBeanDefinition = registry.getBeanDefinition(dependantBeanName);
                        dependantBeanDefinition.setDependsOn(beanName);
                    }
                }
            }
            catch (ClassNotFoundException e) { throw new RuntimeException(e); }
        }
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { }
}

然后像你的例子中那样使用它:

@Component("beanA")
public static class BeanA {
    @PostConstruct
    private void init() {
        System.out.println(this.getClass().getSimpleName());
    }
}

@Component("beanB")
@RequiredBy({ "beanC", "beanA" })
public static class BeanB {
    @PostConstruct
    private void init() {
        System.out.println(this.getClass().getSimpleName());
    }
}

@Component("beanC")
@RequiredBy("beanA")
public static class BeanC {
    @PostConstruct
    private void init() {
        System.out.println(this.getClass().getSimpleName());
    }
}
BeanB
BeanC
BeanA
 类似资料:
  • 问题内容: 我将Spring 3.1.3用于Web应用程序,将XML配置与组件扫描结合使用。 我意识到,其中一个扫描组件必须在其他几个组件之前进行初始化。在所有需要构造后初始化的类上,我在方法上具有@PostConstruct批注。 为了设置依赖关系顺序,我在需要先后构造的类上将“ @Component”更改为“ @Component(“ configData”)”。然后,在每个需要在“ conf

  • 根据我所读到的内容,这是我执行依赖顺序所需要的全部内容。 然后我构建了所有的东西,设置了我的断点,并启动了应用程序。我希望在任何依赖bean之前到达“configData”bean中的断点。事情不是这样的。第一个断点在一个依赖bean的“init”方法中。 然后我更改了“log4j.xml”,将“debug”设置为“org.springframework”的日志级别,并重新运行测试。断点行为是相同

  • 对于不改变实例状态的函数,方法的javadoc注释通常与Java-API中@return-tag的注释相同或非常相似。 boolean Collection.IsEmpty() 如果此集合不包含元素,则返回true。 如果此集合不包含元素,则返回:true 现在我正在为许多简单的方法编写javadoc,比如getExpression(),在这些方法中我遇到了同样的问题。我应该像在API中那样做还是

  • 我观看了本Spring开机教程:https://javabrains.io/courses/spring_bootquickstart/lessons/Creating-a-Spring-Data-JPA-Repository 它将@Entity注释放在类名之前。当我试图在我的代码中这样做时,我得到一个错误,说“无法解析@Entity”。 这是我的pom.xml文件: 你知道有什么问题吗?

  • 我正在使用lxml的解析一些大的XML文件(3-5Gig)。由于其中一些文件具有无效字符a。 当使用lxml时。埃特里。parse I可以提供一个解析器,用于恢复无效字符: 有没有办法让iterparse获得相同的功能? 编辑:编码不是这里的问题。这些XML文件中存在无效的字符,可以通过定义一个具有恢复=True的XMLParser来清理这些字符。因为我需要为此使用迭代解析,所以我不能使用自定义解

  • 我有一个3.2.14.Release spring应用程序,并且正在使用java config连接和注入bean。 在我的情况下我需要 设置SSH隧道 创建数据源,使其使用相同的ssh隧道会话 创建使用JDBCTemplate执行SQL查询的查询类 关于如何确保正确的bean初始化顺序,有什么建议吗?