我正在浏览一些关于SpringSource的博客,在一个博客中,作者正在使用@Inject,我想他也可以使用@Autowired.
这是一段代码:
@Inject private CustomerOrderService customerOrderService;
我不确定它们之间的区别,@Inject并且@Autowired如果有人解释了它们之间的差异以及在什么情况下使用哪一个,我将不胜感激?
注意:这是针对常见问题的规范答案.
我有一个Spring @Serviceclass(MileageFeeCalculator),它有一个@Autowiredfield(rateService),但该字段是null我尝试使用它时.日志显示正在创建MileageFeeCalculatorbean和MileageRateServicebean,但NullPointerException每当我尝试mileageCharge在我的服务bean上调用该方法时,我都会得到.为什么Spring没有自动装配领域?
控制器类:
@Controller
public class MileageFeeController {
@RequestMapping("/mileage/{miles}")
@ResponseBody
public float mileageFee(@PathVariable int miles) {
MileageFeeCalculator calc = new MileageFeeCalculator();
return calc.mileageCharge(miles);
}
}
Run Code Online (Sandbox Code Playgroud)
服务类:
@Service
public class MileageFeeCalculator {
@Autowired
private MileageRateService rateService; // <--- should be autowired, is null
public float mileageCharge(final int miles) {
return (miles * rateService.ratePerMile()); // <--- throws NPE
}
}
Run Code Online (Sandbox Code Playgroud)
应该自动装配的服务bean,MileageFeeCalculator但它不是:
@Service …Run Code Online (Sandbox Code Playgroud) 关于控制(IoC)的反转是如何工作的,我有点困惑Spring.
假设我有一个名为的UserServiceImpl实现UserService接口的服务类.
怎么会这样@Autowired?
而在我Controllers,我怎么会instantiate在instance这个服务的?
我会做以下吗?
UserService userService = new UserServiceImpl();
Run Code Online (Sandbox Code Playgroud) 我知道@Component在Spring 2.5中引入了注释,以便通过使用类路径扫描来消除xml bean的定义.
@Bean是在3.0版本中引入的,可以用来@Configuration完全摆脱xml文件并使用java配置.
是否可以重复使用@Component注释而不是引入@Bean注释?我的理解是,最终目标是在两种情况下都创建bean.
我应该在DI中使用哪个注释@Resource(jsr250)或@Autowired(特定于Spring)?
我已经成功地在过去使用两种,@Resource(name="blah")和@Autowired @Qualifier("blah")
我的直觉是坚持使用@Resource标签,因为它已被jsr人批准.
有人对此有强烈的想法吗?
我正在阅读spring 3.0.x参考文档以了解Spring Autowired注释:
我无法理解下面的例子.我们是否需要在XML中执行某些操作才能使用它?
例1
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Autowired
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
例2
public class MovieRecommender {
private MovieCatalog movieCatalog;
private CustomerPreferenceDao customerPreferenceDao;
@Autowired
public void prepare(MovieCatalog movieCatalog,
CustomerPreferenceDao customerPreferenceDao) {
this.movieCatalog = movieCatalog;
this.customerPreferenceDao = customerPreferenceDao;
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
如何通过自动装配两个类来实现相同的接口并使用相同的类?
例:
class Red implements Color
class Blue implements Color
class myMainClass{
@Autowired
private Color color;
draw(){
color.design();
}
}
Run Code Online (Sandbox Code Playgroud)
将调用哪种设计方法?如何确保调用Red类的设计方法而不是Blue?
在一个将由Spring连接的类中使用@Autowired的优缺点是什么?
为了澄清,我正在谈论@Autowired注释,而不是XML中的自动连线.
我可能只是不理解它,但对我来说它几乎看起来像一个反模式 - 你的类开始意识到它们与DI框架相关联,而不仅仅是POJO.也许我是一个贪婪的惩罚,但我喜欢有bean的外部XML配置,我喜欢有明确的布线,所以我确切知道什么是连线在哪里.
我有一个Spring 2.5/Java/Tomcat应用程序.有以下bean,在许多地方的整个应用程序中使用
public class HibernateDeviceDao implements DeviceDao
Run Code Online (Sandbox Code Playgroud)
和以下新的bean:
public class JdbcDeviceDao implements DeviceDao
Run Code Online (Sandbox Code Playgroud)
第一个bean配置为(包括所有bean)
<context:component-scan base-package="com.initech.service.dao.hibernate" />
Run Code Online (Sandbox Code Playgroud)
第二个(新)bean是单独配置的
<bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao">
<property name="dataSource" ref="jdbcDataSource">
</bean>
Run Code Online (Sandbox Code Playgroud)
当然,这会导致启动服务器时出现异常:
嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义类型为[com.sevenp.mobile.samplemgmt.service.dao.DeviceDao]的唯一bean:期望的单个匹配bean但找到2:[deviceDao,jdbcDeviceDao]
从一个试图像这样自动装豆的类
@Autowired
private DeviceDao hibernateDevicDao;
Run Code Online (Sandbox Code Playgroud)
因为有两个bean实现相同的接口.
是否可以配置bean以便这样做
1.我不必对已经HibernateDeviceDao自动装配的现有类进行更改
2.仍然可以像这样使用第二个(新)bean:
@Autowired
@Qualifier("jdbcDeviceDao")
Run Code Online (Sandbox Code Playgroud)
即我需要一种方法将HibernateDeviceDaobean 配置为要自动装配的默认bean,同时允许在使用注释JdbcDeviceDao显式指定时使用@Qualifier.
我试过设置属性
autowire-candidate="false"
Run Code Online (Sandbox Code Playgroud)
在JdbcDeviceDao的bean配置中:
<bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao" autowire-candidate="false">
<property name="dataSource" ref="jdbcDataSource"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
因为Spring文档说明了这一点
指示在查找匹配候选项以满足另一个bean的自动装配要求时是否应考虑此Bean.请注意,这不会影响名称的显式引用,即使指定的bean未标记为autowire候选,也会解析引用.*
我解释为我仍然可以JdbcDeviceDao使用@Qualifier注释自动装配并具有HibernateDeviceDao默认bean.显然,我的解释是不正确的,因为这会在启动服务器时导致以下错误消息:
类型[class com.sevenp.mobile.samplemgmt.service.dao.jdbc.JdbcDeviceDao]的不满意依赖:预计至少有一个匹配的bean
来自我尝试使用限定符自动装配bean的类:
@Autowired
@Qualifier("jdbcDeviceDao")
Run Code Online (Sandbox Code Playgroud)
我创建了一个简单的单元测试,但IntelliJ错误地将其突出显示为红色.将其标记为错误
没豆子?

如下所示,它通过了测试?那么必须是Autowired?

因为我一直在使用Spring,如果我要编写一个具有依赖项的服务,我会执行以下操作:
@Component
public class SomeService {
@Autowired private SomeOtherService someOtherService;
}
Run Code Online (Sandbox Code Playgroud)
我现在遇到了使用另一个约定来实现相同目标的代码
@Component
public class SomeService {
private final SomeOtherService someOtherService;
@Autowired
public SomeService(SomeOtherService someOtherService){
this.someOtherService = someOtherService;
}
}
Run Code Online (Sandbox Code Playgroud)
我理解这两种方法都有效.但是使用选项B有一些优势吗?对我来说,它在类和单元测试中创建了更多代码.(必须编写构造函数而不能使用@InjectMocks)
有什么我想念的吗?除了在单元测试中添加代码之外,还有其他任何自动装配的构造函数吗?这是一种更优先的依赖注入方式吗?
autowired ×10
spring ×10
java ×9
annotations ×3
spring-mvc ×2
constructor ×1
inject ×1
null ×1
spring-3 ×1