在spring中使用构造函数中的autowired依赖项

时间:2013-12-02 15:05:22

标签: java spring autowired

我有类的NetworkUsageService,它使用NetworkUsageMapper来访问数据库。 Mapper类自动连接到服务类。

我需要在构造服务类的过程中访问数据库,所以我做了类似的事情:

private int someField;    

@Autowired
private NetworkUsageMapper networkUsageMapper;


public NetworkUsageService() {
    someField = networkUsageMapper.getSomeResultFromDB();
}

但是,这似乎不起作用,因为我在创建服务bean时遇到异常。有没有办法在构造对象时使用自动连接的依赖?

编辑: 这是我要求的bean配置:

<context:component-scan base-package="mypackage" />
<mybatis:scan base-package="mypackage.mappers" />

<mvc:annotation-driven />

<context:property-placeholder location="classpath:/jdbc.properties"/>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mapperLocations" value="classpath:mappers/*.xml" />
    <property name="typeAliasesPackage" value="mypackage.transfer" />
</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

<bean  id="dataSource"
       class="org.springframework.jdbc.datasource.DriverManagerDataSource">

    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>

4 个答案:

答案 0 :(得分:11)

不是在构造函数中做很多工作(并且可能因为应用程序在未完全初始化时尝试转到数据库而引入问题),所以最好在不同的方法中进行初始化并使用@PostConstruct。通过这种方式,您可以确保在调用networkusermapper之前完全连接了应用程序。

答案 1 :(得分:1)

这是对的。首先构造bean,然后注入依赖项。如果您在构造函数中需要它,请执行此操作

@Autowired
public NetworkUsageService(NetworkUsageMapper mapper){
// do stuff
}

答案 2 :(得分:1)

另一种方法是使用@Required注释对NetworkUsageMapper的setterMethod进行注释

@Required
public void setNetworkUsageMapper(NetworkUsageMapper mapper){
this.networkUsageMapper = mapper;
this.someField = this.networkUsageMapper.getSomeResultFromDB();
}

在构造对象后,将立即强制调用此方法。当您拥有一长串强制属性以使对象正常工作时,这非常有用。我们可以使用带有@Required注释的setter来设置所有属性,而不是使用具有长参数列表的构造函数。这对我来说似乎非常方便。

答案 3 :(得分:0)

如果您可以添加异常堆栈跟踪以及弹簧配置,这将有助于更准确地回答。我猜这是因为你可能有多个用于NetworkUsageMapper类的bean实例或者它丢失了。

  1. 如果它缺少只需添加一个:)。为避免异常,您可以使用必需的属性:

    @Autowired(所需=假) privateUsUsageMapper networkUsageMapper;

  2. 如果不止一个,那么您需要使用限定符,例如:

  3. 然后

    @Autowired
    @Qualifier("networkUsageMapper1")
    private NetworkUsageMapper networkUsageMapper;
    

    希望它有所帮助:Mak