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

Spring自动连接自动连接bean中的属性

谢夜洛
2023-03-14

我是Spring的新手。我正面临Spring-Boot的问题。我正在尝试将外部配置文件中的字段自动装配到自动装配的bean中。我有以下类

应用程序。Java语言

public class App {

@Autowired
private Service service;

public static void main(String[] args) {

    final SpringApplication app = new SpringApplication(App.class);
    //app.setShowBanner(false);
    app.run();
}

@PostConstruct
public void foo() {
    System.out.println("Instantiated service name = " + service.serviceName);
}
}

AppConfig。Java语言

@Configuration
@ConfigurationProperties
public class AppConfig {

@Bean
public Service service()    {
    return new Service1();
}
}

服务接口

public interface Service {
    public String serviceName ="";
    public void getHistory(int days , Location location );
    public void getForecast(int days , Location location );
}

服务1

@Configurable
@ConfigurationProperties
public class Service1 implements Service {

@Autowired
@Value("${serviceName}") 
public String serviceName;
//Available in external configuration file.
//This autowiring is not reflected in the main method of the application.



public void getHistory(int days , Location location)
{
    //history code
}

public void getForecast(int days , Location location )
{
    //forecast code
}
}

我无法在App类的postconstruct方法中显示服务名称变量。我这样做对吗?

共有2个答案

经炜
2023-03-14

考虑到你的类App注释有@SpringBootApplicationApp类在顶部包中,你可以把你的serviceName放在application.properties中,并使用@Value("${serviceName}")注入它。不要在类上使用@Component如果您已经在配置上使用@Bean,它会发生冲突,因此@Autowire@Value

有关更多信息,请参阅文档

你会以这样的结尾

@Service // @Component specialization
public class Service1 implements Service {

@Value("${serviceName}") 
public String serviceName;
//Available in external configuration file.
//This autowiring is not reflected in the main method of the application.



public void getHistory(int days , Location location)
{
    //history code
}

public void getForecast(int days , Location location )
{
    //forecast code
}
}

当您有@组件/@服务/@存储库时,不需要@Bean声明

@Configuration
public class AppConfig {  //other stuff here not duplicated beans  }

还有你的主课

    package com.app;

    @SpringBootApplication // contains @EnableAutoConfiguration @ComponentScan @Configuration   
    public class App {

    @Autowired
    private Service service;

    public static void main(String[] args) {

        final SpringApplication app = new SpringApplication(App.class);
        //app.setShowBanner(false);
        app.run();
    }

    @PostConstruct
    public void foo() {
        System.out.println("Instantiated service name = " + service.serviceName);
    }
    }
戴凯歌
2023-03-14

您可以通过不同的方式加载属性:

想象一下下面的application.properties,它是由spry-boot自动加载的。

spring.app.serviceName=Boot demo
spring.app.version=1.0.0

>

  • 使用@Value注入值

    @Service
    public class ServiceImpl implements Service {
    
    @Value("${spring.app.serviceName}") 
    public String serviceName;
    
    }
    

    使用@ConfigurationProperties注入值

    @ConfigurationProperties(prefix="spring.app")
    public class ApplicationProperties {
    
       private String serviceName;
    
       private String version;
    
       //setters and getters
    }
    

    您可以使用Autowired从另一个类访问此属性

    @Service
    public class ServiceImpl implements Service {
    
    @Autowired
    public ApplicationProperties applicationProperties;
    
    }
    

    正如您所注意到的,前缀将是spring。app然后spring boot将属性前缀与之匹配,并查找服务名称和版本,然后将注入值。

  •  类似资料:
    • 我正在使用Swing和Spring创建一个金融应用程序。在应用程序的一部分中,我有一个,其中包含应用程序中每个的。单击时,我希望在中显示类型的。这都是在下面的控制器中执行的。 会为每个点击更改,因此我将设置为一个原型bean,因此我将为每个帐户接收一个新实例。为了使原型作用域工作,我需要使用。以下是代码: 您将注意到我试图自动连接类型的bean。但是,该bean没有正确地自动连接,它是空的。以下是

    • 我在spring中定义了一个映射: 然后我将这个bean自动转换为一个属性,该属性定义为: 干杯。

    • 我创建了自己的库(com.custom.mylib),它返回一个字符串,如下所示。 我创建了一个将使用上述库的项目。我已将lib作为pom依赖项包含在内。但是当我尝试从我的应用程序调用库方法时。我得到了下面的错误。如何解决它? 请考虑在您的配置中定义一个“com.custom.mylog.MyLibrary”类型的bean。 我在application.properties文件中也有下面的内容,这

    • 我通过Spring Boot 1.1.8使用Spring 4,并创建了一个类来缓存一些数据。这个类依赖于泛型来工作,但我在Spring和将这个类自动连接为另一个服务中的bean方面遇到了问题。 我会遇到如下错误: 所涉及的班级: 类BaseRepository扩展JpaRepository如下。其他实际存储库扩展了这个。 BaseWithName类是一个MappedSuperclass,它定义名称

    • 出于某种原因,我使用外部属性源,其中一个外部属性源没有自动连接,在创建身份验证bean时接收空指针 原因: org.springframework.beans.BeanInstantiationException: Failed to instanceiate [com.filechecker.check.Authenticator]: Constructor threw exception;ne

    • 问题内容: 可以与列表一起使用吗? 就像我有带有mimetypes的属性文件,而在我的班级文件中,我有类似的东西 问题答案: Spring 4支持自动收集给定类型的所有bean并将其注入到集合或数组中的能力。 例: