第一步,创建主体配置类来取代applicationContext.xml,因为我们知道在之前的XML文件的配置方式里,我们是在applicationContext.xml里面设置:

  1. Bean的id和他对应的实现类的映射关系,同时实现资源的注入
<bean id="UserDao" name="userDao" class="com.itheima.dao.daoImp.UserDaoImp">
        <property name="username" value="${username}"/>
        <property name="pwd" value="${password}"/>
    </bean>

2.整合myBatis,需要考虑到提供配置文件的位置(因为myBatis是根据配置文件自动替我们生成Dao的,我们只需要拿个接口接着就行了)

<!--加载mybatis的映射扫描配置,把他作为bean进行管理-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--这个basePackage也意味着扫描读取com.itheima.dao包下所有的文件,也就是所有的接口配置文件-->
        <property name="basePackage" value="com.itheima.dao"/>
    </bean>

拿个接口接着:

<!--配置AccountService的bean,注入AccountDao-->
    <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
        <!--前者名字代表变量名,后面是实际的映射类接口名,Spring会帮我们根据配置文件自动生成的 -->
        <property name="accountDao" ref="accountDao"/>
    </bean>

扯得有点远了,纯注解开发还是简单易懂很多的。
回到第一步,定义主配置类:(直接加上@Configuration注解即可,同时要定义好扫描哪个包下面所有的Bean,以及使用到的配置文件,这里加载的配置文件,在其他任何地方都可以直接使用)

@Configuration//设置为主体配置类
@ComponentScan("com.itheima")//扫描哪个包下面的所有Bean
@PropertySource("classpath:jdbc.properties")//读取配置文件,多个配置文件使用数组格式
@Import({JDBCConfig.class})//导入其他要用的类,(如果不导入且这些类没用@Component注解,那就不会被扫描到)
public class SpringConfig {
}

第二步,定义第三方类为Bean:(以DataSource为例)

public class JDBCConfig {
	//在主配置类SpringConfig里面引入PropertySource之后就可以全局使用了
	//使用@Value进行注入
    @Value("${jdbc.driverClassName}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;

    @Bean("datasource")//将当前的返回方法定义为Bean,其实你注意他的返回值就好了,其他的无所谓
    public DataSource getDataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        System.out.println(driver+"---"+url+"---"+username+"---"+password);
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }
}

对比一下在XML中的定义:

<bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${driverClassName}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${jusername}"/>
        <property name="password" value="${jpassword}"/>
    </bean>

其实只不过用Set方法自己手动实现了注入。

同时请注意为了使得该Bean被扫描到,我们需要在主配置类中导入他:

@Configuration//设置为主体配置类
@ComponentScan("com.itheima")//扫描哪个包下面的所有Bean
@PropertySource("classpath:jdbc.properties")//读取配置文件,多个配置文件使用数组格式
@Import({JDBCConfig.class})//导入其他要用的类,(如果不导入且这些类没用@Component注解,那就不会被扫描到)
public class SpringConfig {
}

到这里,我们的第三方类就配置完成了。
第三步,定义我们自定义的类为Bean:以service为例(注意Bean都是实现类哈,除了Dao是myBatis帮我们实现的,使用@Component使得该类可以被扫描到)

@Component("accountService")
public class AccountServiceImpl implements AccountService {
    
    @Autowired//你已经有这个接口了,Spring会自动替你实现的
    private AccountDao accountDao;
    
    @Override
    public void save(Account account) {
        accountDao.save(account);
    }

    @Override
    public void delete(Integer id) {
        accountDao.delete(id);
    }

    @Override
    public void update(Account account) {
        accountDao.update(account);
    }

    @Override
    public List<Account> findAll() {
        return accountDao.findAll();
    }

    @Override
    public Account findById(Integer id) {
        return accountDao.findById(id);
    }
}

第四步,上面我们提到了AccountDao是会被自动实现的,但是显然我们只是提供了一个接口,他是怎么实现自动实现的呢,这里就要涉及myBatis的最后配置部分了:

public class MyBatisConfig {
    @Bean//注意这里我们都没有写id,因为这两个方法其实我们不需要调用,直接写好交给Spring自动调用就好了。
    public SqlSessionFactoryBean getSqlSessionFactoryBean(@Autowired DataSource dataSource){
        SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
        ssfb.setTypeAliasesPackage("com.itheima.domain");//这样做了以后该包下的类名就是映射名,而不需要使用全路径名了
        ssfb.setDataSource(dataSource);//注意我们这里之前已经配好了DataSource Bean,所以这里我们只需要让Spring放过来就好了
        return ssfb;
    }
    @Bean
    public MapperScannerConfigurer getMapperScannerConfigurer(){
        MapperScannerConfigurer msc = new MapperScannerConfigurer();
        msc.setBasePackage("com.itheima.dao");//扫描Dao接口包
        return msc;
    }
}

注意这里@Bean不需要定义@Value,因为我们不会调用他的,是Spring来调用的,所以你可以直接当成固定格式来用即可。
最后在主配置文件里面导入这个MyBatisConfig.class即可。

@Configuration//设置为主体配置类
@ComponentScan("com.itheima")//扫描哪个包下面的所有Bean
@PropertySource("classpath:jdbc.properties")//读取配置文件,多个配置文件使用数组格式
@Import({JDBCConfig.class,MyBatisConfig.class})//导入其他要用的类,(如果不导入且这些类没用@Component注解,那就不会被扫描到)
public class SpringConfig {
}

我们回过头来看看myBatis是如何创建Dao的

//1.加载核心配置文件
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");

        //2.获取SqlSession工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

        //3.通过工厂对象获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession(true);

        //4.获取OneToOneMapper接口的实现类对象(注意OneToOneMapper是个接口,我们没实现)
        OneToOneMapper mapper = sqlSession.getMapper(OneToOneMapper.class);