Мои классы проекта в приложении весенней загрузки:
package com.example.demo;
public class FirstModel {
public String getString(){
return "first model";
}
}
package com.example.demo;
public class SecondModel {
public String getString(){
return "second model";
}
}
package com.example.demo;
import org.springframework.beans.factory.FactoryBean;
public class MyFactory implements FactoryBean {
Class<?> clazz;
@Override
public Object getObject() throws Exception {
if (clazz.equals(FirstModel.class)) return new FirstModel();
else return new SecondModel();
}
@Override
public Class<?> getObjectType() {
return clazz;
}
}
package com.example.demo;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfiguration {
@Bean
public MyFactory getMyFactory(){
MyFactory myFactory = new MyFactory();
myFactory.clazz = SecondModel.class;
return myFactory;
}
}
package com.example.demo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class HelloController {
@Resource
SecondModel secondModel;
@RequestMapping("/")
public String index() {
return firstModel.getString();
}
}
Почему, когда я вводю аннотацию @Resource, она работает нормально, но когда я использую @Autowired
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class HelloController {
@Autowired
SecondModel secondModel;
@RequestMapping("/")
public String index() {
return secondModel.getString();
}
}
Intellij Idea говорит, что
«Не удалось выполнить автоматическое подключение. Не найдены компоненты типа« SecondModel »», но когда я запускаю приложение, оно также отлично работает как @ Resource
Есть ли разница между обнаружением bean-компонентов @Resource и @Autowired во время компиляции или во время выполнения? Насколько я знаю, если в @Resource нет атрибутов, он работает как @Autowired по типу.