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

Spring Boot应用程序不能实例化类,除非它用Autowired进行注释

施琦
2023-03-14
public class StrategyFactory {
    private Strategy1 strategy1;
    private Strategy2 strategy2;
    private Strategy3 strategy3;

    @Autowired
    public StrategyFactory(Strategy1 strategy1) {
        this.strategy1 = strategy1;
    }

    public StrategyFactory(Strategy2 strategy2) {
        this.strategy2 = strategy2;
    }

    public StrategyFactory(Strategy3 strategy3) {
        this.strategy3 = strategy3;
    }

    public GenericStrategy getTrailerStrategy(String strategy) {
        LOGGER.info("Retrieving Strategy Class for {}", strategy);
        if (strategy.equals("CLOSE_DETAIL")) {
            return strategy1;
        } 
        else if(strategy.equals("LOAD_TRAILER")) {
            return strategy2;
        } 
        else if(strategy.equals("CLOSE_SUMMARY")) {
            return strategy3;
        } 
        else {
            throw new InvalidStrategyTypeException("Invalid Strategy Type");
        }
    }
}

如何将其他策略实例化?

共有1个答案

高才
2023-03-14

因为只有用@autowired注释的构造函数才会得到处理并注入依赖项。Strategy2Strategy3的构造函数被忽略,因为其上没有@Autowired

您有两种选择:

(1)改为使用现场注入而不是施工方注入:

public class StrategyFactory {
    @Autowired
    private Strategy1 strategy1;
    @Autowired
    private Strategy2 strategy2;
    @Autowired
    private Strategy3 strategy3;

    StrategyFactory(){}
}
public class StrategyFactory {
    private List<GenericStrategy> strategy; 

    @Autowired
    public StrategyFactory(List<GenericStrategy> strategy) {
        this.strategy = strategy1;
    }

    public GenericStrategy getTrailerStrategy(String strategy) {
        LOGGER.info("Retrieving Strategy Class for {}", strategy);
        GenericStrategy result = null; 
        if (strategy.equals("CLOSE_DETAIL")) {
            result = getStrategy(Strategy1.class);
        } 
        else if(strategy.equals("LOAD_TRAILER")) {
            result = getStrategy(Strategy2.class);
        } 
        else if(strategy.equals("CLOSE_SUMMARY")) {
           result = getStrategy(Strategy3.class);
        } 
        else {
            throw new InvalidStrategyTypeException("Invalid Strategy Type");
        }

        if(result == null){
          throw new RuntimeException("Fail to load the strategy....");
        }
    }

    private <T> GenericStrategy getStrategy(Class<T> clazz){
        for(GenericStrategy s : strategy){
          if(clazz.isInstance(s)){
            return s;
          }
        }
        return null;
    }
}
 类似资料:
  • 项目: el-admin 后台 代码如下 deptService 对象没有用过注解, 为什么还能调用 deptService.download ? 有没有大佬知道这个对象是怎么被实例化的? 完整的 DeptController 代码如下

  • 我试图测试一个@Controller类,其中有来自POJO的列表。我可以在另一个@RESTController类中使用@Autowired来连接控制器,但在同样的情况下,我不能将其用于测试。 user.java UserContrell3.java 在下一个类中,userresource.java我可以做@autowired 但是,在测试类UserTest.java中。我不能: 提前感谢!

  • 我试图在SpringMVC中运行SpringBoot应用程序,在SpringMVCPOM中添加SpringBoot应用程序依赖项,并扫描SpringBoot包,但我面临以下问题

  • 这是我使用SpringBoot的第一天,我试图理解体系结构,因此我开始构建一个hello world应用程序: 在我的pom.xml中,在maven-shade-plugin下,我将mainClass声明如下: 文件目标是src/main/java/com/demo/helloworld.java,该文件中的代码是: 我错过了什么?

  • 2020-06-26T09:26:58.880610+00:00Heroku[web.1]:状态从开始更改为>崩溃2020-06-26T12:16:58.291701+00:00Heroku[web.1]:状态从崩溃更改为>开始2020-06-26T12:17:05.611518+00:00Heroku[web.1]:用命令启动进程>2020-06-26T12:17:08.625648+00:00

  • 我想了解如何在MVC4应用程序中解决统一命名类型注册。 我正在使用“Unity 3.0”和“Unity boostrapper for ASP.NET MVC”。 我知道unity是在DependencyResolver中注册的,所以我可以使用DependencyResolver方法来获取注册类型的实例。 当我想要回一个简单的注册时,这很好。 例如 但是,当我想获取对命名类型注册的引用时,IDep