首先我们的xml配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<context:property-placeholder location="classpath:properties/db.properties" />
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="typeAliasesPackage" value="cn.qinglanglu.spring.demo.repository.pojo"/>
<property name="mapperLocations" value="classpath:mybatis/mapperxml/*.xml"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.qinglanglu.spring.demo.repository.mapper" />
</bean>
</beans>
我们知道,自从Spring4.X以后,基于Java的配置方式一直是Spring推荐的方式,当然了,推荐不等于强制要求,我们还是可以使用xml的,甚至可以xml与Java配置方式混合使用都行。
不扯别的了,现在我们就一起来看看xml配置文件如何修改成Java的配置方式吧
这是一个配置文件,我们曾说过,@Configuration作用的类就相当于一个xml配置文件,所以我们需要创建一个配置(即有@Configuration注解的类)。
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisConfiguration {
}
到这里,我们就相当于有了一个xml配置文件。接下来,我们需要把xml里面的bean,配置到我们配置类里面。我们之前有说过@Bean的作用就相当于xml配置文件里的bean标签。
@Bean作用的方法,返回值表示bean的类型,方法名表示bean的ID。所以我们定义DataSource的时候就应该这样写:
@Configuration
public class MybatisConfiguration {
/*<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>*/
@Bean
public DruidDataSource dataSource() {
}
}
现在问题来了,那方法里面该怎么写呢?这时我们的方法还没有返回值,所以会编译就报错了。
以我们丰富的开发经验我们很清楚,如果想让方法编译正常,那就必须要返回一个与之对应的数据类型。
所以我们就new一个DataSource并给他返回。我们这里用的是DuidDataSource;
@Configuration
public class MybatisConfiguration {
/*<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>*/
@Bean
public DruidDataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
return dataSource;
}
}
xml配置文件里的bean标签里的property,代表该bean的属性,我们@Bean作用的方法,最终会把返回值放入IOC容器,所以在放入容器之前,也就是方法返回之前,我们也需要给Bean设置一些属性。
@Configuration
public class MybatisConfiguration {
/*<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>*/
@Bean
public DruidDataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/qinglanglu?useSSL=false&useUnicode=true&characterEncoding=utf-8");
dataSource.setUsername("root");
dataSource.setPassword("123456");
return dataSource;
}
}
有的朋友就疑惑了,IOC不是控制反转么,不是把Bean的创建权交给外部容器么,怎么这里就自己new了呢,是不是违背了IOC思想了呢?
注意:其实没有违背IOC思想,这里我们只是写了个方法,我们可以看到这个方法我们没有任何代码去调用这个方法,可想而知,这个方法是给我们Spring来调用的,所以这个bean的创建,还是Spring创建的,只是我们自己定义了这个bean一些创建规则,跟我们用xml配置文件的思想是一致的。
改进:
我们数据库的链接,一般还需要抽取到外部配置文件里,然后通过@Value注解到成员属性里面,方法里再引用成员属性。
@Configuration
public class MybatisConfiguration {
@Value("${jdbc.driver}")
private String driverClassName;
@Value("${jdbc.url}")
private String url;
@Value("${username}")
private String username;
@Value("${password}")
private String password;
@Bean
public DruidDataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
接下来,我们来看看sessionFactory的配置,这个配置稍有点不同,因为它的bean上ref引用了DataSource,那么Java配置如何体现这种引用依赖关系呢,显然,只能通过方法的传参了。实现如下:
package cn.qinglanglu.spring.demo.config;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import com.alibaba.druid.pool.DruidDataSource;
@Configuration
public class MybatisConfiguration {
@Value("${jdbc.driver}")
private String driverClassName;
@Value("${jdbc.url}")
private String url;
@Value("${username}")
private String username;
@Value("${password}")
private String password;
@Bean
public DruidDataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
/*<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="typeAliasesPackage" value="cn.qinglanglu.spring.demo.repository.pojo"/>
<property name="mapperLocations" value="classpath:mybatis/mapperxml/*.xml"/>
</bean>*/
public SqlSessionFactoryBean sessionFactory(DruidDataSource dataSource) {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setTypeAliasesPackage("cn.qinglanglu.spring.demo.repository.pojo");
Resource resource = new ClassPathResource("mybatis/mapperxml/*.xml");
sqlSessionFactoryBean.setMapperLocations(new Resource[]{resource});
return sqlSessionFactoryBean;
}
}
至此,我们的示例就讲完了,有什么疑问,可以留言!