Data Access: 数据访问
Data Integration: 数据集成
Web: Web开发
AOP:面向切面编程
Aspects: AOP思想实现
Core Container: 核心容器
Test:单元测试与集成测试
●代码书写现状(重复写实现类,数据层的实现类变了的话,要重新编译运行)
●耦合度偏高
●解决方案
●使用对象时, 在程序中不要主动使用new产生对象,转换为由外部提供对象
●IoC ( Inversion of Control )控制反转(可以管理大量的对象)
使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转(对象的创建控制权由程序转移到外部,这种思想称为控制反转)
●Spring技术对IoC思想进行了实现
Spring提供了一个容器,称为IoC容器,用来充当IoC思想中的外部
IoC容器负责对象的创建、初始化等一系列工作, 被创建或被管理的对象在IoC容器中统称为Bean
●DI ( Dependency Injection )依赖注入
●在容器中建 立bean与bean之间的依赖关系的整个过程,称为依赖注入
目标:充分解耦
●使用IoC容器管理bean (IoC)
●在IoC容器内将有依赖关 系的bean进行关系绑定(DI)
●最终效果
●使用对象时不仅可以直接从IoC容器中获取, 并且获取到的bean已经绑定了所有的依赖关系
总结:
IoC思想和DI思想
IoC容器
Bean
概括:IoC的思想就是用对象的时候不用new,而是由外部提供。Spring技术实现的时候就是通过IoC容器提供。DI思想就是把用关系的Bean绑好,这样运行的时候就不会少对象,可以完美的运行。Bean就是IoC创建和初始化的对象。
分析
1.管理什么? ( Service与Dao )
2.如何将被管理的对象告知IoC容器? (配置)
3. 被管理的对象交给IoC容器,如何获取到IoC容器? (接口)
4. IoC容器得到后 ,如何从容器中获取bean ? (接口方法)
5.使用Spring导入哪些坐标? ( pom . xml )
步骤:
①:导入Spring坐标(在pom.xml)
②:定义Spring管理的类(接口)
③:创建Spring配置文件,配置对应类作为Spring管理的bean .
<!--bean标签标示配置bean
id属性标示给bean起名字
class属性表示给bean定义类型-->
④:初始化IoC容器( Spring核心容器/Spring容器) , 通过容器获取bean
public static void main(String[] args) {
//3.创建并,初始化Ioc容器,ctx属于对象
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//4.获取Bean,是通过getBean()的方法
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
//5.通过对象调用方法
bookDao.save();
}
}
分析
1.基于IoC管理bean
2. Service中使用new形 式创建的Dao对象是否保留? (否)
3. Service中需要的Dao对象如何进 入到Service中? (提供方法)
4. Service与Dao间的关系如何描述 ? (配置)
步骤
①:删除使用new的形式创建对象的代码
②:提供依赖对象对应的setter方法
③:配置service与dao之间的关系
<bean id="bookService" class="com..service.impl.BookServiceImpl">
<!--7.配置server与dao的关系-->
<!--property标签表示配置当前bean的属性
name属性表示配置哪一个具体的属性
ref属性表示参照哪一个bean-->
<property name="bookDao" ref="bookDao"/>
</bean>
为什么bean默认为单例?
适合交给容器进行管理的bean
■表现层对象
■业务层对象
■数据层对象
■工具对象
不适合交给容器进行管理的bean
■封装实体的域对象
Bean的作用范围就是控制创建对象数量的
总结Bean配置
1.基础配置
id:命名:name:重命名,class:Bean的类型(全类名),scope:bean的作用范围(创建几个对象)
第一种:构造方法
第二种:静态工厂
第三种:实例工厂
第四种:使用FactoryBean实例化Bean
生命周期:从创建到消亡_的完整过程
bean生命周期: bean从创建到销毁的整体过程
bean生命周期控制:在bean创建后到销毁前做一些事情
初始化容器
1.创建对象 (内存分配)
2.执行构造方法
3.执行属性注入( set操作)
4.执行bean初始化方法
使用bean
1.执行业务操作
关闭/销毁容器
1.执行bean销毁方法
思考:向一个类中传递数据的方式有几种?
1普通方法(set方法)
2.构造方法
思考:依赖注入描述了在容器中建立bean与bean之间依赖关系的过程, 如果bean运行需要的是数字或字符串呢?
■引用类型
■简单类型(基本数据类型与String )
依赖注入方式
■setter注入
简单类型
引用类型
![在这里插入图片描述](https://img-blog.csdnimg.cn/da174ad1704e4c86964b6423d1f475f4.png)
1.强制依赖使用构造器进行 ,使用setter注入有概率不进行注入导致nu11对象出现
2.可选依赖使用setter注入进行 ,灵活性强
3. Spring框架倡导使用构造器 , 第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨
4.如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入
5.实际开发过程中还要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入
6.自己开发的模块推荐使用setter注入
IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配
自动装配方式
■按类型(常用)
■按名称
■按构造方法
■不启用自动装配
自动装配用于引用类型依赖注入, 不能对简单类型进行操作
使用按类型装配时( byType )必须保障容器中相同类型的bean唯一,推荐使用
使用按名称装配时( byName )必须保障容器中具有指定名称的bean , 因变量名与配置耦合, 不推荐使用
自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
<property name="array">
<array>
<value>100value>
<value>200value>
<value>300value>
array>
property>
<property name="list">
<list>
<value>itcastvalue>
<value>itheimavalue>
<value>boxueguvalue>
<value>chuanzhihuivalue>
list>
property>
<property name="set">
<set>
<value>itcastvalue>
<value>itheimavalue>
<value>boxueguvalue>
<value>boxueguvalue>
set>
property>
<property name="map">
<map>
<entry key="country" value="china"/>
<entry key="province" value="henan"/>
<entry key="city" value="kaifeng"/>
map>
property>
<property name="properties">
<props>
<prop key="country">chinaprop>
<prop key="province">henanprop>
<prop key="city">kaifengprop>
props>
property>
bean>
创建容器
//1.加载类路径下的配置文件
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//2.从文件系统下加载配置文件
ApplicationContext ctx = new FileSystemXmlApplicationContext("D:\\workspace\\spring\\spring_10_container\\src\\main\\resources\\applicationContext.xml");
大总结:
1.容器相关
BeanFactory是IoC容器的顶层接口,ApplicationContext接口是Spring容器的核心接口。
ApplicationContext接口常用的初始化类(ClassPathXmlApplicationContext和FileSystemXMLApplicationContext)
2.Bean相关
3.依赖注入