今天学习了spring框架的体系,BeanFactory和ApplicationContext的区别,Bean的声明周期、依赖注入DI,以及构造器注入、set方法注入、集合注入的讲解。
继续加油!奥利给!
人生重要的不是所站的位置,而是所朝的方向
中国加油!武汉加油!千锋加油!我自己加油
01_Spring概述
Spring是什么?
Spring是分层的 Java SE/EE应用轻量级开源框架,以 IoC(Inverse Of Control:反转控 制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核
提供了视图层SpringMVC和持久层Spring JDBCTemplate以及业务层事务管理等众多的企 业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的 JavaEE企业应用开源框架
Spring的优势
方便解耦,简化开发
AOP 编程的支持
声明式事务的支持
方便程序的测试
02_Spring资源包说明
下载地址:
http://maven.springframework.org/release/org/springframework/spring/
核心jar(4个),日志包(1个)
spring‐beans‐5.1.8.RELEASE.jar
spring‐context‐5.1.8.RELEASE.jar
spring‐core‐5.1.8.RELEASE.jar spring‐expression‐5.1.8.RELEASE.jar
spring‐jcl‐5.1.8.RELEASE.jar
03_使用 spring 的 IOC 解决程序耦合4
控制反转IoC(Inversion of Control)
控制:控制的双方是什么?谁控制谁?
主控方:Spring
被控方:应用程序所使用的资源
(原始)应用程序直接控制需要的外部资源
(Spring)Spring控制所需要的外部资源
反转:什么是反转?反转什么?
正向:应用程序直接调用资源
反向:应用程序依赖Spring为其提供资源
反转的是资源的控制权
应用程序由主动调用资源,变为被动的等待Spring提供资源
有什么好处?
正向缺点:应用程序控制的资源分布在程序的每一个地方
反向的优点:所有的资源都在Spring中,便于管理,降低了耦合度。
总结: Spring反向控制应用程序所需要使用的外部资源。资源受Spring管理,利用率最大化
04_ApplicationContext的三个实现类
ApplicationContext 接口的实现类
ClassPathXmlApplicationContext: 它是从类的根路径下加载配置文件 推荐使用这种 FileSystemXmlApplicationContext: 它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。 AnnotationConfigApplicationContext: 当我们使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注 解。
05_BeanFactory和ApplicationContext的区别
BeanFactory 才是Spring容器中的顶层接口。ApplicationContext 是它的子接口。 BeanFactory 和 ApplicationContext 的区别:
ApplicationContext:只要一读取配置文件,默认情况下就会创建对象。
BeanFactory:什么使用什么时候创建对象
06_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>
07_Bean的生命周期
单例对象: scope="singleton"
一个应用只有一个对象的实例。它的作用范围就是整个引用。
生命周期:
对象出生:当应用加载,创建容器时,对象就被创建了。
对象活着:只要容器在,对象一直活着。
对象死亡:当应用卸载,销毁容器时,对象就被销毁了
多例对象: scope="prototype"
每次访问对象时,都会重新创建对象实例。
生命周期:
对象出生:当使用对象时,创建新的对象实例。
对象活着:只要对象在使用中,就一直活着。
对象死亡:当对象长时间不用时,被 java 的垃圾回收器回收了。
08_依赖注入DI
依赖注入: Dependency Injection。
它是 Spring 框架核心 IOC 的具体实现。
在编写程序时,通过控制反转,把对象的创建交给了Spring,但是代码中不可能出现没有依 赖的情况
IOC 解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法,那这 种业务层和持久层的依赖关系,在使用Spring之后,就让Spring来维护了。简单的说,就是 框架把持久层对象传入业务层,而不用我们自己去获取
09_构造器注入
顾名思义,就是使用类中的构造函数,给成员变量(简单类型、javaBean)赋值。注意,赋值的操 作不是我们自己做的,而是通过配置的方式,让spring框架来为我们注入。
具体步骤如下: a.提供对应的构造方法 b.配置构造方法的参数
10_set方法注入
顾名思义,就是在类中提供需要注入成员的set方法给成员变量(简单类型、javaBean)赋值。注意,赋值的操作不是我们自己做的,而是通过配置的方式,让spring框架来为我们注入。
具体步骤如下: 提供对应的set方法 配置set方法的参数
11_集合注入
顾名思义,就是给类中的集合成员传值,它用的也是set方法注入的方式,只不过变量的数据类 型都是集合。我们这里介绍注入数组, List,Set,Map
public class Bean01{
private String[] myStrs;
private List<String> myList;
private Set<String> mySet;
private Map<String,String> myMap;
private Properties myProps;
//Setter方法
}
<bean id="bean01" class="com.qzw.bean.Bean01">
<property name="myStrs" >
<array>
<value>aaa</value>
<value>bbb</value>
</array>
</property>
<property name="myList">
<list>
<value>aaa</value>
<value>bbb</value>
</list>
</property>
<property name="mySet">
<list>
<value>aaa</value>
<value>bbb</value>
</list>
</property>
<property name="myMap">
<map>
<entry key="key1" value="value1" >
</entry>
</map>
</property>
</bean>