第一步,创建主体配置类来取代applicationContext.xml,因为我们知道在之前的XML文件的配置方式里,我们是在applicationContext.xml里面设置:
- 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);