我是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并且没有上述代码?我该如何管理应用程序上下文?我非常感谢任何评论家。
答案 0 :(得分:0)
@Autowired
注释不适用于Spring容器未初始化的组件。您正在手动创建FirstServiceImpl
,调用参数化构造函数。 Spring组件还需要一个不带参数的构造函数(如果你没有显式指定,那么默认构造函数也会工作),因为Spring使用它来创建它们(通过反射)。您应使用@Service
和带有@Repository
注释的DAO注释服务类以使其正常工作。
您必须记住的主要事情是让Spring尽可能多地初始化组件(服务,DAO,其他bean)。因此,您可以@Autowire
将它们转换为其他Spring组件。