将 class 注解的 @Component 更改为 @Bean 注解的方法

Changing a class annotated @Component to @Bean annotated method

我有一个 class 注释 @Component 然后 @Autowired 变成另一个 class。但是,我需要删除此 @Component 注释,而是在 class 中使用 @Bean 注释方法创建它,该方法以前是自动装配的。

以前 classes 看起来像:

@Component
public class MyClass implements IMyClass
{
    // Stuff
}

@Configuration
public class MyUsingClass
{
    @Autowired
    private IMyClass myClass;

    private void methodUsingMyClass()
    {
        myClass.doStuff();
    }
}

所以现在我删除了 @Component 注释并编写了一个 @Bean 注释方法,如下所示:

public class MyClass implements IMyClass
{
    // Stuff
}

@Configuration
public class MyUsingClass
{
    @Bean
    public IMyClass getMyClass()
    {
        return new MyClass();
    }

    ....
}

我的问题是关于替换之前的 myClass.doStuff() 调用以使用新 bean。我现在是否将 MyClass 类型的参数传递给私有方法:

private void methodUsingMyClass(final MyClass myClass)
{
    myClass.doStuff();
}

... 还是我直接调用这个方法(对我来说似乎不是正确的方法):

private void methodUsingMyClass()
{
    getMyClass().doStuff();
}

...或者这些都不正确?

使用注释解决方案

public class MyClass implements IMyClass{

    private OtherClassInjection otherClassInjection;

    private OtherClassInjection2 otherClassInjection2;

    MyClass(OtherClassInjection otherClassInjection, OtherClassInjection2 otherClassInjection2){
        this.otherClassInjection=otherClassInjection;
        this.otherClassInjection2=otherClassInjection2;
    }

    public void useObject(){
        otherClassInjection.user();
    }

}

@Bean(name = "myClass")
@Autowired
@Scope("prototype") //Define scope as needed
public MyClass getMyClass(@Qualifier("otherClassInjection") OtherClassInjection otherClassInjection, 
                          OtherClassInjection2 otherClassInjection2) throws Exception
{
    return new MyClass(otherClassInjection, otherClassInjection2);
}

这是合乎逻辑的,如果上下文知道你想要注入的那个 bean,那么在创建 Bean 时注入 @Autowired 是有效的。

我就是这么用的

我认为您误解了 @Bean 注释。它可以用来创建一个 Bean。所以基本上 spring 会扫描所有 类,会找到你的 @Bean 并创建一个 Bean,而不是更多。您现在可以使用这个 bean,就像您使用 <bean></bean> 创建的一样。要实际使用该 bean,您需要从 ApplicationContext@Autowire 中获取它。当然,您仍然可以像代码中的任何其他函数一样使用该函数来创建该对象的新实例,但这与您希望使用 beans

实现的目标相矛盾