Spring IOC基于配置文件实现
- spring的优势
- 方便解耦,简化开发
- AOP编程的支持
- 声明式事务的支持
- 方便程序的测试
- 方便集成各种优秀框架
- 降低JavaEE API的使用难度
- Java源码是经典学习范例
- 程序的耦合
- 一个创建Bean对象的工厂
- Bean:在计算机英语中,有可重用组件的含义。
- JavaBean:用java语言编写的可重用组件
- javabean >> 实体类(远大于)
- 他就是创建我们的service和dao对象
- 第一个:需要一个配置文件来配置我们的service和dao
- 配置的内容:唯一标识 = 全限定类名(key = value)
- 第二个:通过读取配置文件中配置的内容,反射创建对象
- 我的配置文件可以是xml也可以时properties
public class BeanFactory {
private static Properties props;
private static Map<String,Object> beans;
static {
try {
props = new Properties();
InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
props.load(in);
beans = new HashMap<String,Object>();
Enumeration keys = props.keys();
while (keys.hasMoreElements()){
String key = keys.nextElement().toString();
String beanPath = props.getProperty(key);
Object value = Class.forName(beanPath).newInstance();
beans.put(key,value);
}
}catch(Exception e){
throw new ExceptionInInitializerError("初始化properties失败!");
}
}
public static Object getBean(String beanName){
return beans.get(beanName);
}
}
控制反转
- 概念
- 控制反转(Inversion of Control,英文缩写为IoC)把创建对象的权力交给框架,是框架的重要特征,并非面向对象变成的专用术语,它包括依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)
- 明确IOC作用:
- 削减计算机程序的耦合(解除我们代码中的依赖关系),只能降低耦合。
使用spring的IOC解决程序耦合
bean.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">
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"></bean>
<bean id="accountDao" class="com.itheima.dao.impl.AccountDaoImpl"></bean>
</beans>
- 获取spring的IOC核心容器,并根据id获取对象
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
IAccountService as = (IAccountService)ac.getBean("accountService");
IAccountDao adao = ac.getBean("accountDao",IAccountDao.class);
- ApplicationContext的三个实现类
ClassPathXmlApplicationContext
:可以加载类路径下的配置文件,要求配置文件必须在类路径下,不在的话,无法加载(更常用)FileSystemXmlApplicationContext
:可以加载磁盘任意路径下的配置文件(必须有访问权限)AnnotationConfigApplicationContext
:它是用于读取注解创建容器的
- 核心容器的接口引发出的问题:
- ApplicationContext:单例对象适用,实际开发中采用此接口
- 它在构建核心容器时,创建对象采取的策略是采用立即加载的方式,也就是说,只要一读取完配置文件马上就创建配置文件中配置的对象
- BeanFactory:多例对象适用
- 它在构建核心容器时,创建对象采取的是策略是采用延迟加载的方式,也就是说,什么时候根据id获取对象了,什么时候才真正的创建对象
spring对bean的管理细节
- 创建bean的三种方式
- 第一种:使用默认构造函数创建
- 在spring的配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签时。采用的就是默认构造函数创建bean对象,此时如果类中没有默认构造函数,则对象无法创建。
- 第二种:使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)
<bean id="instanceFactory" class="com.itheima.factory.InstanceFactory"></bean>
<bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService"></bean>
- 第三种:使用静态工厂中的静态方法创建对象(使用某个类中的静态方法创建对象并存入spring容器)
<bean id="accountService" class="com.itheima.factory.StaticFactory" factory-method="getAccountService"></bean>
- 第二种和第三种方法主要生成那些jar包中无法修改的方法创建的bean对象
- bean对象的作用范围
- bean的作用范围调整
- bean标签的scope属性:
- 作用:用于指定bean的作用范围
- 取值:
- singleton:单例(默认值)
- prototype:多例
- request:作用于web应用的请求范围
- session:作用于web应用的会话范围
- global-session:作用于集群环境的会话范围(全局会话范围),当不是集群环境时,他就是session
- bean对象的生命周期
- 单例对象
- 多例对象
- 出生:当使用对象时spring框架为我们创建
- 活着:对象在使用过程中一直活着。
- 死亡:当对象长时间不用且没有别的对象引用时,由JVM的GC回收
依赖注入
- IOC作用:
- 依赖关系的管理:
- 在当前类中需要用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明
- 依赖关系的维护:
- 依赖注入:
- 能注入的类型:有三类
- 基本类型和String
- 其他的bean类型(在配置文件中或者注解配置过的bean)
- 复杂类型/集合类型
- 注入的方式:有三种
- 第一种:使用构造函数,在类中提供所有属性的构造函数
- 第二种:使用set方法提供,在类中提供所有属性的set方法
- 第三种:使用注解提供
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
<constructor-arg name="name" value="泰斯特"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
<constructor-arg name="birthday" ref="now"></constructor-arg>
</bean>
<bean id="now" class="java.util.Date"></bean>
<bean id="accountService2" class="com.itheima.service.impl.AccountServiceImpl2">
<property name="name" value="TEST" ></property>
<property name="age" value="21"></property>
<property name="birthday" ref="now"></property>
</bean>
<bean id="accountService3" class="com.itheima.service.impl.AccountServiceImpl3">
<property name="myStrs">
<set>
<value>AAA</value>
<value>BBB</value>
<value>CCC</value>
</set>
</property>
<property name="myList">
<array>
<value>AAA</value>
<value>BBB</value>
<value>CCC</value>
</array>
</property>
<property name="mySet">
<list>
<value>AAA</value>
<value>BBB</value>
<value>CCC</value>
</list>
</property>
<property name="myMap">
<props>
<prop key="testC">ccc</prop>
<prop key="testD">ddd</prop>
</props>
</property>
<property name="myProps">
<map>
<entry key="testA" value="aaa"></entry>
<entry key="testB">
<value>BBB</value>
</entry>
</map>
</property>
</bean>