关于Spring中两大Bean对象以及Spring整合Mybatis时SqlSessionFactory原理分析

1. Spring中的两大Bean对象

Spring中Bean对象构建方式分析:
关于Spring中两大Bean对象以及Spring整合Mybatis时SqlSessionFactory原理分析_第1张图片
1)spring中第一种bean没有实现BeanFactory接口则直接创建相应的Bean对象本身。
2)spring中第二种Bean实现了BeanFactory接口,Bean底层会创建两个对象,第一个是Bean本身,第二个是由Bean对象调用它的getObject()方法创建的具体工厂对象。
eg:SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); SqlSessionFactory sessionFactory = factoryBean.getObject();
在Spring中配置后缀为FactoryBean类型的对象时底层都会产生两个对象,一般来说创建复杂的工厂对象时会用到

2.SqlSessionFactory的创建

  1. 在只有mybatis时我们通过SqlSessionFactoryBuilder.build()方法来创建SqlSessionFactory会话工厂来产生会话。
public class MybatisTest {
	SqlSessionFactory ssf;//线程安全  可以变成成员变量使用
	@Before
	public void init() {
		try {
			String resource = "mybatis-config.xml";	
			InputStream in = Resources.getResourceAsStream(resource);
			ssf = new SqlSessionFactoryBuilder().build(in);
		} catch (IOException e) {	
			e.printStackTrace();
		}	
	}

	@Test
	public void myTest() throws IOException {
		//1. 获取sqlsession对象,加载配置文件
		InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
		
		//2. 根据读取到的配置文件创建会话工厂
		 ssf = new SqlSessionFactoryBuilder().build(in);
		
		//3. 根据会话工厂创建 会话对象
		SqlSession session = ssf.openSession();
		
		//4.statement参数 用来定位sql  哪个mapper文件的哪个sql语句
		String statement = "userMapper.findUser";
		List list = session.selectList(statement);
		
		for (User user : list) {
			System.out.println(user);
		}
		
		// 5.释放资源
		session.close();
	}
  1. 在Spring整合Mybatis时,SqlSessionFactory由Spring中的一个Bean对象SqlSessionFactoryBean来创建。具体配置如下:
    由于SqlSessionFactoryBean实现了FactoryBean接口,所以SqlSessionFactoryBean底层会创建两个对象,第一个是SqlSessionFactoryBean本身,第二个是由SqlSessionFactoryBean对象调用它的getObject()方法创建的具体工厂对象。SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); SqlSessionFactory sessionFactory = factoryBean.getObject();
    其实SqlSessionFactoryBean 也只是分装了SqlSessionFactoryBuilder.build()来构建SqlSessionFactory对象
    ctrl+shift+t查看源码:
    关于Spring中两大Bean对象以及Spring整合Mybatis时SqlSessionFactory原理分析_第2张图片
    关于Spring中两大Bean对象以及Spring整合Mybatis时SqlSessionFactory原理分析_第3张图片
    进入afterPropertiesSet();构建对象的方法:
    关于Spring中两大Bean对象以及Spring整合Mybatis时SqlSessionFactory原理分析_第4张图片
    可以看到底层还是调用SqlSessionFactoryBuilder.build来构建SqlSessionFactory对象。

你可能感兴趣的:(ssm)