标签: autowired

Spring Framework中的@Inject和@Autowired有什么区别?在什么条件下使用哪一个?

我正在浏览一些关于SpringSource的博客,在一个博客中,作者正在使用@Inject,我想他也可以使用@Autowired.

这是一段代码:

@Inject private CustomerOrderService customerOrderService;

我不确定它们之间的区别,@Inject并且@Autowired如果有人解释了它们之间的差异以及在什么情况下使用哪一个,我将不胜感激?

java spring dependency-injection inject autowired

659
推荐指数
9
解决办法
28万
查看次数

为什么我的Spring @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)

java null spring nullpointerexception autowired

555
推荐指数
14
解决办法
42万
查看次数

自动装配如何在Spring工作?

关于控制(IoC)的反转是如何工作的,我有点困惑Spring.

假设我有一个名为的UserServiceImpl实现UserService接口的服务类.

怎么会这样@Autowired

而在我Controllers,我怎么会instantiateinstance这个服务的?

我会做以下吗?

UserService userService = new UserServiceImpl();
Run Code Online (Sandbox Code Playgroud)

java spring spring-mvc ioc-container autowired

481
推荐指数
5
解决办法
33万
查看次数

Spring:@Component与@Bean

我知道@Component在Spring 2.5中引入了注释,以便通过使用类路径扫描来消除xml bean的定义.

@Bean是在3.0版本中引入的,可以用来@Configuration完全摆脱xml文件并使用java配置.

是否可以重复使用@Component注释而不是引入@Bean注释?我的理解是,最终目标是在两种情况下都创建bean.

java spring annotations autowired

387
推荐指数
14
解决办法
21万
查看次数

@Resource vs @Autowired

我应该在DI中使用哪个注释@Resource(jsr250)或@Autowired(特定于Spring)?

我已经成功地在过去使用两种,@Resource(name="blah")@Autowired @Qualifier("blah")

我的直觉是坚持使用@Resource标签,因为它已被jsr人批准.
有人对此有强烈的想法吗?

java spring annotations dependency-injection autowired

359
推荐指数
9
解决办法
22万
查看次数

了解Spring @Autowired用法

我正在阅读spring 3.0.x参考文档以了解Spring Autowired注释:

3.9.2 @Autowired和@Inject

我无法理解下面的例子.我们是否需要在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?

java spring autowired spring-3

295
推荐指数
3
解决办法
40万
查看次数

Spring @Autowired用法

在一个将由Spring连接的类中使用@Autowired的优缺点是什么?

为了澄清,我正在谈论@Autowired注释,而不是XML中的自动连线.

我可能只是不理解它,但对我来说它几乎看起来像一个反模式 - 你的类开始意识到它们与DI框架相关联,而不仅仅是POJO.也许我是一个贪婪的惩罚,但我喜欢有bean的外部XML配置,我喜欢有明确的布线,所以我确切知道什么是连线在哪里.

java spring autowired

217
推荐指数
4
解决办法
7万
查看次数

自动装配两个bean实现相同的接口 - 如何将默认bean设置为autowire?

背景:

我有一个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)

解: …

java spring spring-mvc autowired

132
推荐指数
3
解决办法
13万
查看次数

intellij错误地说没有为自动装配的存储库找到类型的bean

我创建了一个简单的单元测试,但IntelliJ错误地将其突出显示为红色.将其标记为错误

没豆子?

在此输入图像描述

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

在此输入图像描述

java spring annotations intellij-idea autowired

117
推荐指数
16
解决办法
14万
查看次数

Spring @Autowire on Properties vs Constructor

因为我一直在使用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)

有什么我想念的吗?除了在单元测试中添加代码之外,还有其他任何自动装配的构造函数吗?这是一种更优先的依赖注入方式吗?

spring constructor dependency-injection autowired

111
推荐指数
7
解决办法
4万
查看次数