SSM中Service调用Dao的方法显示对象为null

产生的问题:
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "com.flamelp.dao.subject.SubjectMapper.getAll()" because "this.subjectMapper" is null

项目结构:

img

在mybatis-config.xml文件中设置了

    <typeAliases>
        <package name="com.flamelp.entity"/>
    </typeAliases>

applicationContext.xml文件中配置了以下内容,为了缩小检查范围,只设置了SubjectMapper的映射

<!-- 数据库连接池 -->
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/stu_manager" />
        <property name="username" value="root" />
        <property name="password" value="sasa" />
        <!--连接池的最大数据库连接数 -->
        <property name="maxTotal" value="255" />
        <!--最大等待连接中的数量 -->
        <property name="maxIdle" value="5" />
        <!--最大等待毫秒数 -->
        <property name="maxWaitMillis" value="10000" />
    </bean>

    <!--    根据数据源创建sqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--设置数据sqlSessionFactory引用数据源-->
        <property name="dataSource" ref="dataSource" />
        <!--与mybatis的配置文件相关联,主要是对应的实体类的别名-->
        <property name="configLocation" value="classpath:mybatis-config.xml" />
        <!--配置Dao类对应的SQL语句映射的XML文件-->
        <property name="mapperLocations">
            <list>
                <!--表示dao包里面任意包下面的xml文件都加入映射-->
                <value>classpath:com/flamelp/dao/subject/*.xml</value>
            </list>
        </property>
    </bean>

    <!--自动扫描包里面的接口,并将其配置成bean-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.flamelp.dao.subject"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
    </bean>

service层中的代码

@Service
public class SubjectServiceImpl implements SubjectService {
    @Autowired
    private SubjectMapper subjectMapper;

    @Override
    public List<Subject> getAll() {
        return subjectMapper.getAll();
    }
}

在入口程序main方法中调用:

SubjectService subjectService = new SubjectServiceImpl();
List<Subject> subList = subjectService.getAll();

运行时出现"this.subjectMapper" is null的问题。

因为SubjectServiceImpl中的mapper是由spring进行依赖注入的,在使用service被spring初始化的时候spring容器会根据依赖注入对应的mapper,但是您这里使用new的方式创建service实例,并不是有spring统一进行管理的,所以导致service进行实例化的时候mapper没有被注入进来,导致空指针异常。在spring项目中,除了pojo之外,大部分类都要由spring进行管理。

你不要new serviceimpl啊,通过注解注入进去,不然肯定空指针的

img

类似于这样的

img