APP直接依赖资源,这样APP会无法独立,耦合度太强
IOC如图所示:APP将直接寻找资源的权利交给工厂,通过工厂对象进行资源的整合,以此减少程序间的耦合度
IOC的概念:
控制反转,把创建对象的权利交给框架,是框架的重要特征,
并非面向对象编程的专用术语,它包括依赖注入(Dependency Injection)
和依赖查找(Dependency Lookup)
IOC作用:
削减计算机程序的耦合度(尽量减少我们代码中的依赖关系)
使用Spring的IOC解决程序耦合(IOC的唯一作用)
目的:使用spring解决依赖关系,并不是正真的要CRUD,所以没必要写实体类,用模拟即可。
并且使用的是java工程,并非javaWeb,
也没必要写JavaBean
步骤:
1.准备spring的依赖开发包(jar包)
2.创建配置文件,导入xml 约束
3.把对象的创建交给spring来管理
jcl是阿帕奇的日志,beans spel context core是核心容器相关的jar
aop是注解相关的jar
CoreContainer是一个Map,类似BeanFactory中,存储单例对象的Map
步骤1 准备spring的依赖开发包(jar包):
步骤2 创建配置文件,导入xml 约束:
步骤3 把对象的创建交给spring来管理:
获取核心容器ApplicationContext,根据id获取Bean对象
ApplicationContext的三个常用实现类
ClassPathXmlApplicationContext:它可以加载类路径下的配置文件,
配置文件必须在类路径下,不在的加载不了
FileSystemXmlApplicationContext:可以加载磁盘任意路径下的
有访问权限的配置文件
AnnotationConfigApplication:用于读取注解创建容器
IAccountService与IAccountDao两个的实现类的打印地址
ApplicationContext与BeanFactory的区别:
ApplicationContext:单例对象适用,因为只创建一个对象
(也可以在配置文件中选用多例的策略创建对象)
在构建核心容器时,创建对象采取的策略是采用立即加载的方式,
只要一读取完配置文件,马上就创建配置文件中的配置的对象
BeanFactory:多例对象适用,因为对象不一样,
所以什么时候用什么时候创建
在创建核心容器时候,采取的是延迟加载的方式,即什么时候根据
id获取对象,什么时候创建对象
spring对bean的管理细节
1.创建bean的三种方式
2.bean对象的作用范围
3.bean对象的生命周期
1.Bean创建的第一种方式:
使用默认构造函数创建在spring的配置文件中使用bean标签,
配以id和class属性后,且没有其他属性和标签时。
采用的就是默认构造函数创建bean对象,
此时如果类中没有默认构造函数,则对象无法创建。
xml配置:
类的代码(含默认构造):对象创建,代码正常运行
类的代码(不含默认构造):对象无法创建,程序报错
2.Bean创建的第二种方式:
使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,
并存入spring容器)
xml配置:
类中的代码:
3.Bean创建的第三种方式:
xml配置:
类中的代码:
Bean的作用范围:
bean标签的scope属性:
作用:用于指定bean的作用范围
取值:常用的就是单例的和多例的
singleton:创建单例对象(默认值)
prototype:创建多例对象
request:作用于web应用的请求范围
session:作用于web应用的会话范围
global-session:作用于集群环境的会话范围(全局
会话范围),不是集群环境时,它就是session
集群环境(多台服务器)中的global-session
单例配置及代码如下:
多例配置及代码如下:
Bean对象的生命周期
单例对象:
出生:当容器创建时,对象出生
存活:只要容器还在,对象一直活着
死亡:容器销毁,对象销毁
总结:单例对象的生命周期和容器相同
配置及代码如下:
多例对象(懒加载):
出生:当我们使用对象时候,spring框架为我们创建
存活:对象使用过程中就活着
死亡:当对象长时间不用,且没有别的
对象引用时,由Java的垃圾回收器回收
代码:单例模式的代码配置中,更改scope为prototype
依赖注入:
依赖注入:Dependency Injection
IOC:降低程序的耦合(依赖关系)
依赖关系的管理:
1.交给spring来维护
2.在当前类需要用到其他类的对象,由spring为我们
提供,我们只需要在配置文件中说明。
3.依赖关系的维护:就称之为依赖注入
4.依赖注入:
能注入的数据有3类:
基本类型和String
其他bean类型(在配置文件中或注解配置过的bean)
复杂类型/集合类型
注入的方式:有三种
一:使用构造函数提供
二:使用set方法提供
三:使用注解提供
方式一,使用构造函数提供代码如下:
注:下方代码中没有了默认构造,在配置文件
中创建bean放入spring容器之前,必须
先将参数的值注入bean对象
方式二,使用set方法提供代码如下:
方式三,注入复杂类型代码如下:
/**
* 账户的业务层实现类
*/
public class AccountServiceImpl3 implements IAccountService {
private String[] myarray;
private List<String> mylist;
private Set<String> myset;
private Map<String, String> mymap;
private Properties myprops;
public void setMyarray(String[] myarray) {
this.myarray = myarray;
}
public void setMylist(List<String> mylist) {
this.mylist = mylist;
}
public void setMyset(Set<String> myset) {
this.myset = myset;
}
public void setMymap(Map<String, String> mymap) {
this.mymap = mymap;
}
public void setMyprops(Properties myprops) {
this.myprops = myprops;
}
public void saveAccount() {
System.out.println(Arrays.toString(myarray));
System.out.println(mylist);
System.out.println(myset);
System.out.println(mymap);
System.out.println(myprops);
}
}
bean配置如下:
<!--
复杂类型注入/集合类型注入
用于给List结构集合注入的标签
list array set
用于给Map结构集合注入的标签
map props
结构相同,标签可以互换,可以只记每个结构集合只记一个就可以
-->
<bean id="accountService3"
class="itcast.service.impl.AccountServiceImpl3">
<property name="myarray" >
<array>
<value>myarrayAAA</value>
<value>myarrayBBB</value>
<value>myarrayCCC</value>
</array>
</property>
<property name="mylist" >
<list>
<value>mylistAAA</value>
<value>mylistBBB</value>
<value>mylistCCC</value>
</list>
</property>
<property name="myset" >
<set>
<value>mysetAAA</value>
<value>mysetBBB</value>
<value>mysetCCC</value>
</set>
</property>
<property name="mymap" >
<map>
<!-- 注入值的方式一 -->
<entry key="mapA" value="aaa"></entry>
<!-- 注入值的方式二 -->
<entry key="mapB" >
<value>BBB</value>
</entry>
</map>
</property>
<property name="myprops" >
<props>
<prop key="propsC">ccc</prop>
<prop key="propsD">ddd</prop>
</props>
</property>
</bean>