利用set进行动态实现值的注入
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。
在spring中实现控制反转的是ioc容器,其实现方法是依赖注入
使用spring来创建对象,在spring这些称为bean
Bean工厂 BeanFactory ----它负责了对象的整个生命周期--创建、装配、销毁
ApplicationContext是BeanFactory的子接口
在基于Spring的Java EE应用中,所有的组件都被当成Bean处理,包括数据源,Hibernate的SessionFactory、事务管理器等。
一般称BeanFactory为IoC容器,而称ApplicationContext为应用上下文
ApplicationContext容器会在容器初始化时,会将其中的所有对象一次性装配好,以后用这些对象时只需要在内存中直接调用即可
应用程序上下文(Application Context)是Spring更先进的容器
xml配置的方式配置bean和建立bean之间的协作关系
然后通过应用上下文将配置加载到IOC容器,让Spring替我们管理对象,待我们需要使用对象的时候,再从容器中获取bean就ok了
//加载项目中的spring配置文件到容器
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//从容器中获取对象实例
Man man = context.getBean(Man.class);
bean对象什么时候初始化的?、
BeanFactory :这是一个工厂,用于生成任意bean。
采取延迟加载,第一次getBean时才会初始化Bean
ApplicationContext:是BeanFactory的子接口,功能更强大。(国际化处理、事件传递、Bean自动装配、各种不同应用层的Context实现)。当配置文件被加载,就进行对象实例化。
MyBatis - 映射配置文件 :
Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心
Mybatis 提供了 Mapper接口的代理对象,在执行 Mapper接口方法时,实际执行的是Mybatis的代理对象,代理对象在 invoke 方法内获取 Mapper接口类全名+方法全名 作为statement的ID,然后通过ID去Statement匹配注册的SQL,然后使用 SqlSession 执行这个 SQL。
https://www.jb51.net/article/116402.htm
实现这样的功能前提是映射文件和接口主文件名相同,且在同一个包下,映射文件的命名空间是接口的全限定名。
<!-- 注册映射文件(批量注册映射文件,注册com.ghq.model.dao下的所有配置文件) -->
<mappers>
<package name="com.ghq.model.dao"/>
</mappers>
https://www.cnblogs.com/ghq120/p/8322302.html
<!--加载mybatis映射配置的扫描,将其作为spring的bean进行管理-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.itheima.dao"/>
</bean>
项目会自动帮我们扫描配置的包名下的接口来生成映射器,并且完成映射,也就是自己组装bean
猜想:应该是dao接口和映射文件一起生成
basePackage 属性是让你为映射器接口文件设置基本的包路径
<!--spring整合mybatis后控制的创建连接用的对象-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="typeAliasesPackage" value="com.itheima.domain"/>
</bean>
<!--加载mybatis映射配置的扫描,将其作为spring的bean进行管理-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.itheima.dao"/>
</bean>
对比
is = Resources.getResourceAsStream("MyBatisConfig.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
sqlSession = factory.openSession(true);
//获取StudentMapper接口的实现类对象
//获取对应的Mapper,让映射器通过命名空间和方法名称找到对应的SQL,发送给数据库执行后返回结果。
//操作数据库主要是通过SQL语句,那么只要找到SQL语句然后执行不就可以
//sqlSession.getMapper()的内部产生了StudentMapper的实现类,那怎么产生的呢?
//动态代理
/*
被代理对象:真实的对象
代理对象:内存中的一个对象
*/
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
/*
类加载器:和被代理对象使用相同的类加载器
接口类型Class数组:和被代理对象使用相同接口
代理规则:完成代理增强的功能
*/
//通过代理对象调用方法,接收结果
list = mapper.selectAll();