从spring boot中的任何类读取application.properties

时间:2015-12-20 11:01:11

标签: properties spring-boot

当我在application.properties文件中添加一个属性时,可以从主类访问它而没有任何问题。

    @SpringBootApplication
    @ComponentScan(basePackages = "com.example.*")
    public class MailTestApplication implements CommandLineRunner {

        @Value("${admin.mail}")
        String email;

        public static void main(String[] args) {
            SpringApplication.run(MailTestApplication.class, args);
        }

        @Override
        public void run(String... strings) throws Exception {

            System.out.println(email);
            Email email = new Email();
            email.sendMail();
        }
    }

但是,当我尝试从任何其他类访问它时,它永远不会被检索。

    @Component
    public class Email {

        @Autowired
        private MailSender sender;

        @Value("${admin.mail}")
        String email;

        public Email() {
        }

        public void sendMail() {
            SimpleMailMessage msg = new SimpleMailMessage();

            System.out.println(email);

            msg.setTo("sample@email.com");
            msg.setSubject("Send mail by Spring Boot");
            msg.setText("Send mail by Spring Boot");

            sender.send(msg);
        }
    }

我正在阅读其他用户之前发布的一些问题但没有明确的结果。我甚至试图找到一些类似的重新开发的例子。

有人能给我任何线索吗?

提前多多感谢。

1 个答案:

答案 0 :(得分:1)

@Value应该可以工作(我认为你的类在com.example。*包下面,因为你正在扫描那个包)但是如果你想用另一种方式来做这就是我正在使用的:

public class JpaConfiguration {

    public static final String TRANSACTION_MANAGER_NAME = "jpaTransactionManager";

    @Autowired
    Environment applicationProperties;

然后使用它

@Bean
    public DriverManagerDataSource driverManagerDataSource() {
        DriverManagerDataSource driverConfig = new DriverManagerDataSource();

        driverConfig.setDriverClassName(applicationProperties.getProperty("data.jpa.driverClass"));
        driverConfig.setUrl(applicationProperties
                .getProperty("data.jpa.connection.url"));
        driverConfig.setUsername(applicationProperties
                .getProperty("data.jpa.username"));
        driverConfig.setPassword(applicationProperties
                .getProperty("data.jpa.password"));

        return driverConfig;
    }

获取GITHUB REPO后的更新

我真的不知道你想要建造什么,但是:

如果你这样做:

@Override
    public void run(String... strings) throws Exception {

        //System.out.println(email);
        Email email = new Email();
        email.sendMail();
    }

然后你要创建类的实例,而不是spring。所以你不应该自己创建实例它应该是spring。 也就是说,我不知道你是在创建一个Web应用程序,还是两个命令行应用程序。

那说病了给你一个小的解决方案,告诉你依赖注入实际上是有效的。

1_在电子邮件课程中为您的电子邮件添加一个getter。删除CommandLine接口(如果你想实现这个我会建议你把CommandLine implmentations放在另一个包上说Controller);

然后像这样运行你的应用程序:

@SpringBootApplication
@ComponentScan(basePackages = "com.example")
public class MailTestApplication  {

    @Value("${admin.mail}")
    String email;

    public static void main(String[] args) {
       // SpringApplication.run(MailTestApplication.class, args);

        final ConfigurableApplicationContext context = new SpringApplicationBuilder(MailTestApplication.class).run(args);

        Email e = context.getBean(Email.class);
        System.out.println(e.getEmail());
    }

我要展示的关键是,实例是由spring创建的,这就是布线工作的原因。并在控制台中打印电子邮件。 关于电子邮件类:

@Component
public class Email {

//    @Autowired
  //  private MailSender sender;

    @Value("${admin.mail}")
    String email;

    public Email() {
    }

    public void sendMail() {
        SimpleMailMessage msg = new SimpleMailMessage();

        System.out.println(email);

        msg.setTo("sample@email.com");
        msg.setSubject("Send mail by Spring Boot");
        msg.setText("Send mail by Spring Boot");

       // sender.send(msg);
    }

    public String getEmail() {
        return email;
    }


}

我评论了MailSender,因为我认为你也需要配置它,我已经制作了一个自定义的mailSender使用gmail和其他mailCliu,如果你需要我可以与你分享。但我再也不知道你对这款应用的意图是什么了。

希望信息可以帮助你。