SpringMVC中,为什么在Controller层中能够自动注入而在Service层中无法完成自动注入

J2EE 码拜 9年前 (2016-03-15) 1904次浏览
这是本人的Spring-Mybatis配置文件

<?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:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" 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-3.0.xsd
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
">
    <bean id="dataSource"
          class="org.apache.commons.dbcp.BasicDataSource"
          destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="${jdbc_url}"/>
        <property name="username" value="${jdbc_username}"/>
        <property name="password" value="${jdbc_password}"/>
        <property name="maxActive" value="150"/>
        <property name="minIdle" value="5"/>
        <property name="maxIdle" value="20"/>
        <property name="initialSize" value="30"/>
        <property name="logAbandoned" value="true"/>
        <property name="removeAbandoned"  value="true"/>  
        <property name="removeAbandonedTimeout" value="10"/>
        <property name="maxWait" value="1000"/>
        <property name="timeBetweenEvictionRunsMillis" value="10000"/>
        <property name="numTestsPerEvictionRun" value="10"/>
        <property name="minEvictableIdleTimeMillis" value="10000"/>
	<property name="validationQuery" value="SELECT NOW() FROM DUAL"/>
    </bean>
  
   
    <!-- 定义一个事务管理器 -->  
    <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
        <property name="dataSource" ref="dataSource" />  
    </bean>  
    
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mapperLocations" value="classpath:com/dao/*.xml" />
    </bean>
    
    <!-- 配置扫描器 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 扫描com.dao这个包以及它的子包下的全部映射接口类 -->
        <property name="basePackage" value="com.dao" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
    </bean>
    
    <!-- 拦截器方式配置事物 -->
    <tx:advice id="transactionAdvice" transaction-manager="dataSourceTransactionManager">
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="append*" propagation="REQUIRED" />
            <tx:method name="insert*" propagation="REQUIRED" />
            <tx:method name="save*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="modify*" propagation="REQUIRED" />
            <tx:method name="edit*" propagation="REQUIRED" />
            <tx:method name="delete*" propagation="REQUIRED" />
            <tx:method name="remove*" propagation="REQUIRED" />
            <tx:method name="repair" propagation="REQUIRED" />
            <tx:method name="delAndRepair" propagation="REQUIRED" />
            <tx:method name="get*" propagation="SUPPORTS" />
            <tx:method name="find*" propagation="SUPPORTS" />
            <tx:method name="load*" propagation="SUPPORTS" />
            <tx:method name="search*" propagation="SUPPORTS" />
            <tx:method name="datagrid*" propagation="SUPPORTS" />
            <tx:method name="*" propagation="SUPPORTS" />
        </tx:attributes>
    </tx:advice>
    <aop:config>
        <aop:pointcut id="transactionPointcut" expression="execution(* com.service..*Impl.*(..))" />
        <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" />
    </aop:config>
</beans>

这是本人的Spring配置文件

<?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-3.0.xsd">
	<!-- 引入数据库配置文件 -->
	<context:property-placeholder location="classpath:dbconfig.properties"/>

	<!-- 自动扫描装配com.service包下的类 -->
	<context:component-scan base-package="com.service"/>
</beans>

这是本人的SpringMVC配置文件

<?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:p="http://www.springframework.org/schema/p" 
  	xmlns:context="http://www.springframework.org/schema/context"
  	xmlns:util="http://www.springframework.org/schema/util"
  	xmlns:mvc="http://www.springframework.org/schema/mvc"
  	xmlns:tx="http://www.springframework.org/schema/tx"
 	xsi:schemaLocation="
  		http://www.springframework.org/schema/beans
  		http://www.springframework.org/schema/beans/spring-beans.xsd
  		http://www.springframework.org/schema/util
  		http://www.springframework.org/schema/util/spring-util.xsd
  		http://www.springframework.org/schema/context 
  		http://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/tx 
		http://www.springframework.org/schema/tx/spring-tx.xsd 
 		http://www.springframework.org/schema/mvc
  		http://www.springframework.org/schema/mvc/spring-mvc.xsd" >
  
  	<!-- 开启默认的注解映射支持 -->
  	<mvc:annotation-driven/>
  
  	<mvc:view-controller path="/" view-name="forward:/index"/>
  
  	<!-- 静态资源映射 -->
  	<mvc:resources location="/WEB-INF/js" mapping="/js/**"/>
  	<mvc:resources location="/WEB-INF/css" mapping="/css/**"/>
  	<mvc:resources location="/WEB_INF/img" mapping="/img/**"/>
  
  	<!-- 扫描控制器所在包并只扫描Controller注解 -->
  	<context:component-scan base-package="com.controller" use-default-filters="false">
  		<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
  		<!-- <context:include-filter type="regex" expression="com.controller.service"/> -->
  	</context:component-scan>
  
  	<context:component-scan base-package="com.controller.service">
  	</context:component-scan>
  
  
  	<!-- 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
       <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
       <property name="contentType" value="text/html"/>        
       <property name="prefix" value="/WEB-INF/views/"/>
       <property name="suffix" value=".jsp"/>
    </bean>
  
  	<!-- 配置JSON支持 -->
    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />  
	<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >  
	    <property name="messageConverters">  
	        <util:list id="beanList">  
	            <ref bean="mappingJacksonHttpMessageConverter"/>  
	        </util:list>  
	    </property>  
	</bean>  
	<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">  
	    <property name="supportedMediaTypes">  
	        <list>  
	            <value>text/html;charset=UTF-8</value>  
	        </list>  
	    </property>  
	</bean>
  
</beans>

@Service注解

@Service("cmp_ProductService")
public class Cmp_ProductServiceImpl implements ICmp_ProductService {
	@Autowired
	private Cmp_ProductMapper cmp_ProductMapper;

	@Override
	public Cmp_Product SelectById(int id) {
		return cmp_ProductMapper.selectByPrimaryKey(id);
	}

@Controller注解

@Controller
public class IndexController {
	@Resource
	private ICmp_ProductService cmp_ProductService;

在IndexController里面 cmp_ProductService可以自动注入并使用
service层代码

public class IndexControllerService {

	@Resource
	private ICmp_ProductService cmp_ProductService;

调用的时候cmp_ProductService为NULL并没有注入 只能通过WebApplicationContext.getBean获取

解决方案

20

引用:
@Resources("name="cmp_ProductService"")

不好意思,敲错了,你在控制器中可以通过注解@Resource(name=”cmp_ProductService”)试试

80

IndexControllerService上只能用@Controller注解,原因是你的配置指定了包含过滤器:
<context:include-filter type=”annotation” expression=”org.springframework.stereotype.Controller”/>

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明SpringMVC中,为什么在Controller层中能够自动注入而在Service层中无法完成自动注入
喜欢 (0)
[1034331897@qq.com]
分享 (0)