spring 如何在Sping Boot 中手动执行依赖注入

iyzzxitl  于 2023-08-02  发布在  Spring
关注(0)|答案(3)|浏览(154)

我正在尝试示例化一个类,该类使用start()方法实现了一个名为RestApp的接口。

public interface RestApp {
    void start() throws RestAppException;
}

字符串
实现该接口的类如下:

import settings.Settings.Server;

@SpringBootApplication
class SpringRestApp implements RestApp {
    private final Server serverSettings;

    SpringRestApp(Server serverSettings) {
        this.serverSettings = serverSettings;
    }

    @Override
    public void start() throws RestAppException {
        var app = new SpringApplication(SpringRestApp.class);
        app.setDefaultProperties(Collections.singletonMap("server.port", this.serverSettings.port()));
        app.run();
    }
}


这是我第一次使用spring Boot ,我试着启动应用程序,它给予了我下一个错误:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of constructor in internal.rest.SpringRestApp required a bean of type 'settings.Settings$Server' that could not be found.

Action:

Consider defining a bean of type 'settings.Settings$Server' in your configuration.

Process finished with exit code 1


我真正想做的是将spring Boot 从所有项目中分离出来,spring的唯一责任就是侦听HTTP请求并使用控制器处理该请求。
事实上,我没有使用spring Boot 的autoconfiguration,我使用的是我自己的配置类,它使用了“Apache Configurations”库,我不希望在我的类Settings中有任何注解。
我试过使用chat gpt,但它只告诉我这些废话:

public class Main {
    public static void main(String[] args) {
        // Create instances of the needed objects
        Server serverSettings = new Server(); // Suppose that this is your settings class
        RestApp restApp = new SpringRestApp(serverSettings);

        // Do the dependency injection manually    <-- WTF?!?!
        // ...

        // Start the application
        try {
            restApp.start();
        } catch (RestAppException e) {
            e.printStackTrace();
        }
    }
}


我在谷歌和YouTube上都没有找到任何信息。对不起,我的英语,但我很感激你的帮助。
下一个类是示例化数据库和服务器http的设置记录的类,名为:数据库和服务器。我试着把组件注解放在服务器记录中,但它不起作用。

public class Settings {

    public final Database database;
    public final Server server;

    public Settings() throws ConfigurationException {

        var config = new Configurations().properties(new File(".properties"));

        config.setThrowExceptionOnMissing(true);

        this.database = new Database(
                config.getString("DB_USER"),
                config.getString("DB_PASSWORD", ""),
                config.getString("DB_DRIVER"),
                config.getString("DB_HOST"),
                config.getInt("DB_PORT"),
                config.getString("DB_NAME")
        );

        this.server = new Server(
                config.getInt("SERVER_PORT"),
                config.getString("SERVER_FRAMEWORK")
        );
    }
    public record Database(
            String user,
            String password,
            String driver,
            String host,
            int    port,
            String name
    ) {}

    @Component
    public record Server(
            int port,
            String framework
    ){}
}

2nc8po8w

2nc8po8w1#

像这样添加一个新方法,以便Spring创建一个具有指定名称的bean(名称不是必需的,您也可以使用@Bean

@Bean(name = "serverSettings")
public Server server() {
    Server serverSettings = new Server(); 
    return serverSettings;
}

字符串
或者将@Component添加到类中,但name是可选的

@Component("beanName")
public class Server {
 //
}

5lhxktic

5lhxktic2#

考虑在您的配置中定义一个类型为'settings.Settings$Server'的bean
在Server类的顶部添加@Component应该可以解决问题
既然你不想让springboot应用任何DI(你想自己练习DI),你应该从你的类中删除所有的@Component注解。同时删除RestApp类上的@SpringBootApplication注解。这些注解将底层类标记为托管组件,Spring将代表您负责创建和注入依赖项

xwmevbvl

xwmevbvl3#

如果不使用Bean,就不能使用Sping Boot 或Spring Framework。所以我在寻找另一个框架/库,它可以完成这项工作,而不需要依赖注入和Spring Bean的任何“魔力”。我发现了一个叫做Jakarta RESTful Web Services的东西,它并没有强迫你用依赖注入和Bean做一些神奇的事情。所以我只添加了Jersey框架,这是Jakarta RESTful Web Services的实现,并删除了Sping Boot 。它有一个非常直观的API,没有任何魔法,而且很直接

相关问题