- 导入jar包(4个)
- 在classpath(src)目录下创建核心配置文件(spring.xml)
<?xml version="1.0" encoding="UTF‐8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema‐instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring‐beans.xsd
">
</beans>
- 将应用程序需要使用的资源配置成Spring的Bean实例
<!‐‐ 所有资源以Bean的形式存在 ‐‐>
<!‐‐ bean:声明一个资源Bean ‐‐>
<!‐‐ bean:id:用于区分bean的标识 ‐‐>
<!‐‐ bean:class:bean对应的模型类名 ‐‐>
<bean id="user" class="cn.qzw.bean.User">
</bean>
- 测试
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
Object user = ctx.getBean("user");
使用 spring 的 IOC 解决程序耦合
控制反转IoC(Inversion of Control)
控制:控制的双方是什么?谁控制谁?
-
主控方:Spring
1.被控方:应用程序所使用的资源
2.(原始)应用程序直接控制需要的外部资源
3.(Spring)Spring控制所需要的外部资源 -
反转:什么是反转?反转什么?
正向:应用程序直接调用资源
反向:应用程序依赖Spring为其提供资源
1.反转的是资源的控制权
2.应用程序由主动调用资源,变为被动的等待Spring提供资源
有什么好处?
正向缺点:应用程序控制的资源分布在程序的每一个地方
反向的优点:所有的资源都在Spring中,便于管理,降低了耦合度。
总结:
Spring反向控制应用程序所需要使用的外部资源。资源受Spring管理,利用率最大化。
ApplicationContext的三个实现类
ApplicationContext 接口的实现类
- ClassPathXmlApplicationContext:
它是从类的根路径下加载配置文件 推荐使用这种 - FileSystemXmlApplicationContext:
它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。 - AnnotationConfigApplicationContext:
当我们使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注解。
代码测试
- ClassPathXmlApplicationContext源码下
ClassPathXmlApplicationContext application = new ClassPathXmlApplicationContext("applicationContext.xml");
- FileSystemXmlApplicationContext
FileSystemXmlApplicationContext application = new FileSystemXmlApplicationContext("A:\\workspace\\idea\\spring\\src\\applicationCo ntext.xml");
BeanFactory和ApplicationContext的区别
- BeanFactory 才是Spring容器中的顶层接口。
ApplicationContext 是它的子接口。 - BeanFactory 和 ApplicationContext 的区别:
ApplicationContext:只要一读取配置文件,默认情况下就会创建对象。
BeanFactory:什么使用什么时候创建对象。
代码测试
BeanFactory application = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
IUserService userService = (IUserService) application.getBean("userService")
Spring创建对象
Spring创建对象的三种方式
- a.构造器初始化【重点】:
Bean对应的类必须提供一个无参构造方法 - 静态工厂初始化【了解】
提供一个工厂类,使用其中的静态方法获取对象
public class Bean01Factory {
public static Bean01 getBean(){
return new Bean01();
}
}
<bean id="bean01" factory‐method="getBean" class="com.qzw.util.Bean01Factory">
</bean>
实例工厂初始化【了解】
提供一个工厂类,使用其中的普通方法获取对象
public class Bean02Factory {
public Bean01 getBean(){
return new Bean01();
}
}
<bean id="bean01" factory‐method="getBean" factory‐bean="factory"></bean>
<bean id="factory" class="com.qzw.util.Bean02Factory"></bean>
取值范围 | 说明 |
---|---|
singleton | 默认值,单例的 |
prototype | 多例的 |
request | WEB项目中,Spring创建一个Bean的对象,将对象存入到reques t域中 |
session | WEB项目中,Spring创建一个Bean的对象,将对象存入到session 域中 |
global session | WEB项目中,在Portlet环境,如果没有Portlet环境,相当于sessio n |
更改作用域的方法
//scope属性:singleton:单例 ;prototype:非单例
<bean id=”beanId” class=”BeanClassName” scope=”prototype”></bean>
Bean的生命周期
单例对象: scope="singleton"
一个应用只有一个对象的实例。它的作用范围就是整个引用。
- 生命周期:
对象出生:当应用加载,创建容器时,对象就被创建了。
对象活着:只要容器在,对象一直活着。
对象死亡:当应用卸载,销毁容器时,对象就被销毁了。
多例对象: scope="prototype"
每次访问对象时,都会重新创建对象实例。
- 生命周期:
对象出生:当使用对象时,创建新的对象实例。
对象活着:只要对象在使用中,就一直活着。
对象死亡:当对象长时间不用时,被 java 的垃圾回收器回收了。 - 监听init-method:
初始化回调方法名,配置的方法必须由bean对象提供 - destroy-method:
销毁回调方法名,配置的方法必须由bean对象提供