Spring:注入依赖项

时间:2014-05-27 15:33:55

标签: java spring dependency-injection

我是Spring的新手,我对注射有一些疑问和问题(可能还有选择的建筑)

我有两个项目(桌面应用程序)和一个像API一样的应用程序(新的和用Spring制作)

第一个应用程序使用API​​的方法(服务...)

从桌面应用程序中,这段代码称为

ServiceManager serviceManager = ServiceManager.getInstance(dbConn.getConnection());
FirstService firstService = (FirstService)serviceManager.getService(Table.FIRST);
System.out.println("Count: " + firstService.count());

在API应用程序中,有两个不同的模块,Service和DAO模块。

在服务模块中:

public class FirstServiceImpl extends GenericService implements FirstService {

private final static String TABLENAME = "FIRST";

@Autowired
FirstDAO firstDAO;

public FirstServiceImpl(Connection con) {
    super(con, TABLENAME);
}

public int count() throws SQLException {
    firstDAO.init(connection);
    return firstDAO.count();
}}

public class ServiceManager {

private Connection con;
private static ServiceManager instance;

public ServiceManager(Connection con) {
    super();
    this.con = con;
}

public static ServiceManager getInstance(Connection connection) {
    if (instance == null) {
        instance = new ServiceManager(connection);
    }
    return instance;
}

public GenericService getService(Table t) throws SQLException {

    switch (t) {
    case FIRST:
        return new FirstServiceImpl(this.con);
    case SECOND:
        //return new SecondDAO(this.con);
    default:
        throw new SQLException("Trying to link to an unexistant service.");
    }
}

在DAO模块中

@Configuration
public class DAOConfig {

    @Bean
    public FirstDAO firstDAO() {
        System.out.println("Scans!");
        return new FirstDAOImpl();
    }
}

和FirstDAOImpl,这是不相关的。

我的application-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config />

    <context:component-scan base-package="com.ddd.iker.dao" />

</beans>

DAOConfig位于com.ddd.iker.dao

我的问题是,当我尝试执行firstDAO.init()

时,我在FirstServiceImpl中总是得到一个空指针异常

我尝试在ServiceManager的方法.getInstance中使用这段代码。

GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
ctx.load("classpath:application-context.xml");
ctx.refresh();

@Bean是扫描,但我得到了同样的例外。

如果我在FirstServiceImpl的构造函数中设置这段代码,它可以工作(没有Autowired),但我不认为这是最好的方法,因为我想使用注释。

GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
ctx.load("classpath:application-context.xml");
ctx.refresh();
firstDAO = ctx.getBean("firstDAO", FirstDAO.class);
ctx.close();

如何使用@Autowired注释获得firstDA并且没有上述代码?我该如何管理应用程序上下文?我非常感谢任何评论家。

1 个答案:

答案 0 :(得分:0)

@Autowired注释不适用于Spring容器未初始化的组件。您正在手动创建FirstServiceImpl,调用参数化构造函数。 Spring组件还需要一个不带参数的构造函数(如果你没有显式指定,那么默认构造函数也会工作),因为Spring使用它来创建它们(通过反射)。您应使用@Service和带有@Repository注释的DAO注释服务类以使其正常工作。 您必须记住的主要事情是让Spring尽可能多地初始化组件(服务,DAO,其他bean)。因此,您可以@Autowire将它们转换为其他Spring组件。