@Service//业务层组件
public class UserInfoServiceImpl implements UserInfoService
{
Resource(name="userInfoMapper")
private UserInfoMapper userInfoMapper;
@Transactional(readOnly=true)
public List<UserInfo> getUserList(UserInfo user)
{
return userInfoMapper.getUser(user);
}
小弟这里就不明白了,这里把抽象类当做属性,为什么注入的时候也引用这个抽象类,不是引用抽象类的实现类吗!!??
首先,纠正一下,userInfoMapper不是抽象类, 是一个接口。 至于注入的时候,为什么也引用这个接口,是因为spring注解形式默认
这种形式。
userInfoMapper正如1L所说,是个接口,但注入的时候用的的确是接口的实现类。
spring的自动注入是基于动态代理实现的,(javaweb23中设计模式之一),默认是用jdk的代理,而jdk的代理是通过接口来做得,(最好找本将设计模式的书,看下动态代理),Spring还支持一种代理,cglib,是基于实现类实现的
你看下spring实现的依赖注入
<!--mybatis自动扫描加载sql映射文件:mapperScannerConfigurer-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.seven.dao"/><!--指定sql映射文件、接口所在的包-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
http://blog.csdn.net/arthur0088/article/details/5377736
你用的是ssm框架吧,注入的是接口,但是spring帮你给实现了
<!-- 配置sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 自动扫描mapping.xml文件 -->
<property name="mapperLocations" value="classpath:com/mapping/*.xml"></property>
</bean>
<!-- DAO接口所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
这个就是它帮你把这个接口和实现的xml联立一起了,这是mybatis的特性