Spring IOC xml配置方式转为基于Java的配置示例

首先我们的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;
	}
	
	
	
	
	
}

至此,我们的示例就讲完了,有什么疑问,可以留言!

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值