版权声明
- 本文原创作者:谷哥的小弟
- 作者博客地址:http://blog.csdn.net/lfdfhl
案例源码
首先,创建数据源配置类DataSourceConfig;代码如下:
//省略非核心代码
public class DataSourceConfig {
@Bean
public DataSource dataSource(){
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName(driver);
druidDataSource.setUrl(url);
druidDataSource.setUsername(username);
druidDataSource.setPassword(password);
return druidDataSource;
}
}
在DataSourceConfig类中通过@Bean定义了DataSource类型的Bean。
接下来,创建MyBatis配置类MyBatisConfig;代码如下:
public class MyBatisConfig {
//省略非核心代码
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource,PageInterceptor pageInterceptor){
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
Configuration configuration = new Configuration();
configuration.setMapUnderscoreToCamelCase(true);
configuration.setLogImpl(Slf4jImpl.class);
configuration.setAutoMappingBehavior(AutoMappingBehavior.FULL);
sqlSessionFactoryBean.setConfiguration(configuration);
sqlSessionFactoryBean.setTypeAliasesPackage("com.xxx.pojo");
Interceptor[] interceptors = {pageInterceptor};
sqlSessionFactoryBean.setPlugins(interceptors);
return sqlSessionFactoryBean;
}
}
在MyBatisConfig类中通过@Bean定义了SqlSessionFactoryBean类型的Bean。请注意,sqlSessionFactoryBean方法声明了两个形参。其中,第一个形参正是DataSource类型。代码运行后没有报错,并且把之前定义的DataSource类型的Bean自动注入到该形参上。
或许,有的小伙伴有点疑惑:这是为什么呢?怎么就实现了自动注入呢?
形参自动注入
在DataSourceConfig类中,定义了一个DataSource类型的Bean,并通过@Bean注解标记了dataSource()方法。当Spring容器启动时,它会执行这个方法,并创建一个DruidDataSource实例,该实例将被注册为Spring容器中的一个Bean。
在MyBatisConfig类的sqlSessionFactoryBean方法中,定义了一个带有DataSource类型参数的Bean。当Spring容器需要创建这个SqlSessionFactoryBean类型的Bean时,它会查找已经注册的Bean,以找到一个匹配DataSource类型的Bean。由于之前已经在DataSourceConfig中定义并创建了一个DataSource类型的Bean,Spring会自动将这个Bean注入到sqlSessionFactoryBean方法的参数中。
其实,这也给了我们另外一个思路:如果方法中需要某个类型的数据,那么可以先在方法外(类外)利用@Bean注解定义该类型的Bean;然后再将其声明在方法的形参上让Spring自动注入即可在方法内部使用。