java工厂模式读取配置文件*.properties信息

逃离我推掉我的手 2021-12-21 07:59 524阅读 0赞

一、创建两个接口并实现

  1. package com.zz.my_spring_five.practice.second_chapter.individualcomponents.message;
  2. /**
  3. * @author :zhang
  4. * @description:
  5. * @date :Created in 2019/6/27 10:56
  6. */
  7. public interface MessageProvider {
  8. String getMessage();
  9. }
  10. package com.zz.my_spring_five.practice.second_chapter.individualcomponents.message;
  11. /**
  12. * @author :zhang
  13. * @description:
  14. * @date :Created in 2019/6/27 10:59
  15. */
  16. public class HelloWorldMessageProvider implements MessageProvider{
  17. @Override
  18. public String getMessage() {
  19. return "Hello World";
  20. }
  21. }
  22. package com.zz.my_spring_five.practice.second_chapter.individualcomponents.message;
  23. public interface MessageRenderer {
  24. void Render();
  25. void setMessageProvider(MessageProvider messageProvider);
  26. MessageProvider getMessageProvider();
  27. }
  28. package com.zz.my_spring_five.practice.second_chapter.individualcomponents.message;
  29. /**
  30. * @author :zhang
  31. * @description:
  32. * @date :Created in 2019/6/27 11:00
  33. */
  34. public class StandardOutMessageRenderer implements MessageRenderer{
  35. private MessageProvider messageProvider;
  36. @Override
  37. public void Render() {
  38. if (messageProvider == null) {
  39. System.out.println(" You must set the property messageProvider class: StandardOutMessageRenderer . class. getName ()");
  40. } else {
  41. System.out.println("Hello World");
  42. }
  43. }
  44. @Override
  45. public void setMessageProvider(MessageProvider messageProvider) {
  46. this.messageProvider = messageProvider;
  47. }
  48. @Override
  49. public MessageProvider getMessageProvider() {
  50. return this.messageProvider;
  51. }
  52. }

二、工厂类并读取配置文件

配置文件msf.properties(位于springBoot的resources文件夹下)

  1. renderer.class=com.zz.my_spring_five.practice.second_chapter.individualcomponents.message.StandardOutMessageRenderer
  2. provider.class=com.zz.my_spring_five.practice.second_chapter.individualcomponents.message.HelloWorldMessageProvider
  3. import com.zz.my_spring_five.practice.second_chapter.individualcomponents.message.MessageProvider;
  4. import com.zz.my_spring_five.practice.second_chapter.individualcomponents.message.MessageRenderer;
  5. import java.io.IOException;
  6. import java.util.Properties;
  7. /**
  8. * @author :zhang
  9. * @description:
  10. * @date :Created in 2019/6/27 11:16
  11. */
  12. public class MessageSupportFactory {
  13. private static MessageSupportFactory factory;
  14. private Properties properties;
  15. private MessageProvider messageProvider;
  16. private MessageRenderer messageRenderer;
  17. private MessageSupportFactory() {
  18. properties = new Properties();
  19. try {
  20. properties.load(this.getClass().getResourceAsStream("/msf.properties"));
  21. String rendererClass = properties.getProperty("renderer.class");
  22. String providerClass = properties.getProperty("provider.class");
  23. messageRenderer = (MessageRenderer) Class.forName(rendererClass).newInstance();
  24. messageProvider = (MessageProvider) Class.forName(providerClass).newInstance();
  25. } catch (IOException e) {
  26. e.printStackTrace();
  27. } catch (IllegalAccessException e) {
  28. e.printStackTrace();
  29. } catch (InstantiationException e) {
  30. e.printStackTrace();
  31. } catch (ClassNotFoundException e) {
  32. e.printStackTrace();
  33. }
  34. }
  35. static {
  36. factory = new MessageSupportFactory();
  37. }
  38. public static MessageSupportFactory getFactory(){
  39. return factory;
  40. }
  41. public MessageProvider getMessageProvider() {
  42. return messageProvider;
  43. }
  44. public MessageRenderer getMessageRenderer() {
  45. return messageRenderer;
  46. }
  47. }

三、main方法

  1. package com.zz.my_spring_five.practice.second_chapter.individualcomponents.supportfactory;
  2. import com.zz.my_spring_five.practice.second_chapter.individualcomponents.message.MessageProvider;
  3. import com.zz.my_spring_five.practice.second_chapter.individualcomponents.message.MessageRenderer;
  4. /**
  5. * @author :zhang
  6. * @description:
  7. * @date :Created in 2019/6/27 11:36
  8. */
  9. public class MainClass {
  10. public static void main(String... args) {
  11. MessageProvider messageProvider = MessageSupportFactory.getFactory().getMessageProvider();
  12. MessageRenderer messageRenderer = MessageSupportFactory.getFactory().getMessageRenderer();
  13. messageRenderer.setMessageProvider(messageProvider);
  14. messageRenderer.Render();
  15. }
  16. }

四、运行main方法输出Hello World

说明:

出现错误

  1. Exception in thread "main" java.lang.ExceptionInInitializerError
  2. at com.zz.my_spring_five.practice.second_chapter.individualcomponents.supportfactory.MainClass.main(MainClass.java:14)
  3. Caused by: java.lang.NullPointerException
  4. at java.util.Properties$LineReader.readLine(Properties.java:434)
  5. at java.util.Properties.load0(Properties.java:353)
  6. at java.util.Properties.load(Properties.java:341)
  7. at com.zz.my_spring_five.practice.second_chapter.individualcomponents.supportfactory.MessageSupportFactory.<init>(MessageSupportFactory.java:27)
  8. at com.zz.my_spring_five.practice.second_chapter.individualcomponents.supportfactory.MessageSupportFactory.<clinit>(MessageSupportFactory.java:44)
  9. ... 1 more
  10. Process finished with exit code 1

则是properties文件在加载读取的时候错误,修改以下代码中的”/msf.properties”,此处已经配置好

  1. properties.load(this.getClass().getResourceAsStream("/msf.properties"));

扩展:spring经典配置获取实例,配置xml注入,添加app-context.xml,放到resource文件夹下

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:p="http://www.springframework.org/schema/p"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <bean id="provider"
  7. class="com.zz.my_spring_five.practice.second_chapter.individualcomponents.message.HelloWorldMessageProvider" />
  8. <bean id="renderer"
  9. class="com.zz.my_spring_five.practice.second_chapter.individualcomponents.message.StandardOutMessageRenderer"
  10. p:messageProvider-ref="provider" />
  11. </beans>

main方法测试

  1. public class HelloWorldSpringDI {
  2. public static void main(String... args) {
  3. ApplicationContext context = new ClassPathXmlApplicationContext("app-context.xml");
  4. MessageRenderer messageRenderer = context.getBean("renderer", MessageRenderer.class);
  5. messageRenderer.Render();
  6. }
  7. }

使用注解的方式配置获取实例,添加配置文件HelloWorldConfiguration.java

  1. @Configuration
  2. public class HelloWorldConfiguration {
  3. // 相当于<bean id="provider" class="..." />
  4. @Bean
  5. public MessageProvider provider() {
  6. return new HelloWorldMessageProvider();
  7. }
  8. // 相当于<bean id="renderer" class="..." />
  9. @Bean
  10. public MessageRenderer renderer(){
  11. MessageRenderer renderer = new StandardOutMessageRenderer();
  12. renderer.setMessageProvider(provider());
  13. return renderer;
  14. }
  15. }

main方法测试

  1. public class HelloWorldSpringAnnotated {
  2. public static void main(String... args) {
  3. ApplicationContext context = new AnnotationConfigApplicationContext(HelloWorldConfiguration.class);
  4. MessageRenderer renderer = context.getBean("renderer", MessageRenderer.class);
  5. renderer.Render();
  6. }
  7. }

发表评论

表情:
评论列表 (有 0 条评论,524人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java Properties读取配置文件信息

    在我们平时写程序的时候,有些参数是经常改变的,而这种改变不是我们预知的。比如说我们开发了一个操 作数据库的模块,在开发的时候我们连接本地的数据库那么 IP ,数据库名称,表名称

    相关 java读取properties配置文件

    今天要将以前一个项目的数据连接改成从properties文件中配置。找了好久,网上也不少,可就是读取文件时总是找不到文件在哪(我放在 classes目录下了)。最后终于成功,记