一.使用IOC来创建对象的三种方式
1.通过无参的构造方法创建出来
public class User {
public User() {
System.out.println("user的无参构造方法");
}
private String name;
public void setName(String name) {
this.name = name;
}
public void show(){
System.out.println("name="+name);
}
}
2.通过有参的构造方法来创建对象
public class User {
public User(String name) {
super();
this.name = name;
}
private String name;
public void show(){
System.out.println("name="+name);
}
}
applicationContext.xml配置
3.通过·工厂方法来创建对象
a)静态工厂
public class UserFactory {
public static User newInstance(String name){
return new User(name);
}
}
applicationContext.xml配置
<bean id="user" factory-bean="cn.sxt.factory.UserFactory" factory-method="newInstance">
<constructor-arg index="0" value="王五"/>
</bean>
b)动态工厂
public class UserDynamicFactory {
public User newInstance(String name){
return new User(name);
}
}
applicationContext.xml配置
<bean id="userFacotry" class="cn.sxt.factory.UserDynamicFactory"/>
<bean id="user" factory-bean="userFacotry" factory-method="newInstance">
<constructor-arg index="0" value="王五"/>
</bean>
二.IOC和DI
1.IOC
IOC(Inversion of Control):其思想是反转资源获取的方向. 传统的资源查找方式要求组件向容器发起请求查找资源. 作为回应, 容器适时的返回资源. 而应用了 IOC 之后, 则是容器主动地将资源推送给它所管理的组件, 组件所要做的仅是选择一种合适的方式来接受资源. 这种行为也被称为查找的被动形式
2.DI
DI(Dependency Injection) — IOC 的另一种表述方式:即组件以一些预先定义好的方式(例如: setter 方法)接受来自如容器的资源注入. 相对于 IOC 而言,这种表述更直接
3.IOC前生
需求:生成HTML或PDF格式的不同类型的报表
下图表示当我们需要生成时,自动去调用对应的类的方法,生成对应报表
采用工厂设计模式
采用控制反转
三.配置文件详解
1.alias:为bean设置别名,可以设置多个别名
<!-- 设置别名 -->
<alias name="user" alias="user1"/>
2.bean的设置 <!-- bean就是java对象 由spring来创建和管理 -->
<!-- id是bean的标识符 要唯一 如果没有配置id,name默认标识符
如果配置id,又配置了name 那么name是别名
name可以设置多个别名 分隔符可以 是 空格 逗号 分号
class是bean的全限定名=包名+类名
如果不配置 id,和name 那么可以根据applicationContext.getBean(Class) 获取对象
-->
<bean id="h1" name="hello h2,h3;h4" class="cn.sxt.bean.Hello">
<property name="name" value="张三"/>
</bean>
3.为方便团队协作开发,可以通过import来实现
<import resource="config/spring/entity.xml"/>
四.Spring容器
在 Spring IOC 容器读取 Bean 配置创建 Bean 实例之前, 必须对它进行实例化. 只有在容器实例化后, 才可以从 IOC 容器里获取 Bean 实例并使用.
1.Spring 提供了两种类型的 IOC 容器实现.
BeanFactory: IOC 容器的基本实现.
ApplicationContext: 提供了更多的高级特性. 是 BeanFactory 的子接口.
BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身;ApplicationContext 面向使用 Spring 框架的开发者,几乎所有的应用场合都直接使用 ApplicationContext 而非底层的 BeanFactory
无论使用何种方式, 配置文件时相同的.
2.ApplicationContext
ApplicationContext 的主要实现类:ClassPathXmlApplicationContext:从 类路径下加载配置文件
FileSystemXmlApplicationContext: 从文件系统中加载配置文件
ConfigurableApplicationContext 扩展于 ApplicationContext,新增加两个主要方法:refresh() 和 close(), 让 ApplicationContext 具有启动、刷新和关闭上下文的能力
ApplicationContext 在初始化上下文时就实例化所有单例的 Bean。
WebApplicationContext 是专门为 WEB 应用而准备的,它允许从相对于 WEB 根目录的路径中完成初始化工作