以下是我的类:
package com.abc.trade.util;
public class StockTraderLogger {
static Logger logger = Logger.getLogger("StockTraderLogger");
@Autowired
ConfigService configService;
public static void debug(Object className, Object logMessage) {
try {
System.out.println("in debug.. ");
StockTraderLogger stl =new StockTraderLogger();
stl.addMessage(""+convertToString(className)+"t"+convertToString(logMessage));
System.out.println("in debug..post ");
} catch (DataAccessException e) {
System.out.println("Caught exception...");
e.printStackTrace();
}
}
public void addMessage(String message) throws DataAccessException {
System.out.println("in add message of util. ");
System.out.println("String: " + configService);
configService.addMessage(message);
}
}
@Autowire
注释不起作用。当调用addMessage
方法时,它将configService
的值显示为 null。但是它已正确注入到我的某些控制器类中,但此处未正确注入。
谁能解释一下问题是什么?以及如何解决这个问题?
XML 的代码是:(beandefinition.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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
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/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:component-scan base-package="com.abc.trade.util"/>
<context:component-scan base-package="com.abc.trade.service"/>
<!-- Hibernate Configuration -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="annotatedClasses">
<list>
<value>com.abc.trade.model.Order</value>
<value>com.abc.trade.model.Profile</value>
<value>com.abc.trade.model.Log</value>
</list>
</property>
</bean>
<tx:annotation-driven/>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="commonService" class="com.abc.trade.framework.service.CommonServiceImplementor">
<property name="commonDao" ref="commonDao"/>
</bean>
<bean id="commonDao" class="com.abc.trade.framework.dao.HibernateDAO">
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>
<bean id="configService" class="com.abc.trade.service.ConfigServiceImplementor" parent="commonService">
</bean>
<import resource="../context/springws-servlet.xml"/>
</beans>
另一个XML是:(Springmvc-servlet.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:webflow="http://www.springframework.org/schema/webflow-config"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/webflow-config
http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.0.xsd">
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<context:component-scan base-package="com.abc.trade.controller" />
<context:component-scan base-package="com.abc.trade.util"/>
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="messages" />
</bean>
<!-- Exception Resolver -->
<bean id="exceptionResolver"
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="com.abc.trade.framework.exception.DataAccessException">
errorPage</prop>
<prop key="java.sql.SQLException">errorPage</prop>
<prop key="java.lang.Exception">errorPage</prop>
</props>
</property>
</bean>
</beans>
提前谢谢你。
ConfigService
:
package com.abc.trade.service;
import org.springframework.stereotype.Service;
import com.abc.trade.framework.exception.DataAccessException;
public interface ConfigService {
public void addMessage(String message) throws DataAccessException;
}
配置服务实现器:
package com.abc.trade.service;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.abc.trade.framework.exception.DataAccessException;
import com.abc.trade.framework.service.CommonServiceImplementor;
import com.abc.trade.model.Log;
import com.abc.trade.model.Mode;
import com.abc.trade.util.StockTraderLogger;
@Service("configService")
public class ConfigServiceImplementor extends CommonServiceImplementor implements ConfigService{
String errorMessage = "";
@Override
public void addMessage(String message) {
System.out.println("in add message of service...........");
Log log = new Log();
try{
log.setMessage(message);
System.out.println("Message is: "+message);
int i=save(log);
}catch(Exception e)
{
errorMessage = "Error in saving debug message";
e.printStackTrace();
//throw new DataAccessException(errorMessage);
}
}
}
StockTraderLogger 没有被声明为春豆,在春豆上下文中不存在,因此注入不起作用。
<bean id="StockTraderLogger" class="com.abc.trade.util.StockTraderLogger"/>
或
@Component
public class StockTraderLogger { /**/ }
这里的问题出在调试方法中:
StockTraderLogger stl =new StockTraderLogger();
这不是弹簧管理的。您可以通过两种方式将 Spring 托管 bean 注入到非托管 bean 中。在这里,您可以在 StockTraderLogger 中注入 configService:
1)通过自动线能力豆厂:
ApplicationContext ctx = new ClassPathXmlApplicationContext("beansdefinition.xml");
StockTraderLogger stl = new StockTraderLogger();
ctx.getAutowireCapableBeanFactory().autowireBeanProperties(stl, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true);
2)通过使用Spring AOP@Configurable注释,该注释将类标记为符合Spring驱动配置的条件(例如使用"new"运算符实例化的对象)。
@Configurable
public class StockTraderLogger {
...
}
and specifying this <context:spring-configured/> in beansdefinition.xml.
您可以在此处找到有关此春季aop方式的更多信息。
将此添加到applicationContext.xml
:
xmlns:mvc="http://www.springframework.org/schema/mvc"
和
http://www.springframework.org/schema/mvc
到xsi:schemalocation
MVC 注释驱动是注释控制器和其他功能所必需的:
<mvc:annotation-driven />
我想你失踪了
<context:annotation-config />
还要确保你的配置服务类有
@Service("configService")
注释,它将使该类成为自动布线的候选对象。
和你应该使用的原因
<context:component-scan base-package="package" />
作为配置服务包名称。