当我在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);
}
}
我正在阅读其他用户之前发布的一些问题但没有明确的结果。我甚至试图找到一些类似的重新开发的例子。
有人能给我任何线索吗?
提前多多感谢。
答案 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,如果你需要我可以与你分享。但我再也不知道你对这款应用的意图是什么了。
希望信息可以帮助你。