spring基础(一)
1 package com.oracle.demo01; 2 3 import com.oracle.factory.InstanceFactory; 4 import com.oracle.pojo.User; 5 import com.oracle.pojo.User2; 6 import org.junit.Test; 7 import org.springframework.beans.factory.BeanFactory; 8 import org.springframework.context.ApplicationContext; 9 import org.springframework.context.annotation.AnnotationConfigApplicationContext; 10 import org.springframework.context.support.ClassPathXmlApplicationContext; 11 import org.springframework.context.support.FileSystemXmlApplicationContext; 12 13 import java.applet.AppletContext; 14 15 16 public class TestDemo01 { 17 /** 18 * 获取 spring 的 IOC 核心容器,并根据id获取对象 19 * 20 * ApplicationContext:的三个常用实现类 21 * ClassPathXmlApplicationContext:它可以加载类路径下的配置文件,要求配置文件必须在类路径下。不在的话加载不了 22 * FileSystemXmlApplicationContext:他可以加载磁盘下任意路径下的配置文件(必须有访问权限) 23 * AnnotationConfigApplicationContext:它是用于读取注解创建容器的 24 * 25 * 核心容器的两个接口引发出的问题: 26 * ApplicationContext: 单例对象适用 采用此接口 27 * 它是构建核心容器时,创建对象采用的策略是采用立即加载的方式。也就是说,只要一读取完配置文件就马上创建配置文件中配置的对象 28 * BeanFactory: 多例对象适用 采用此接口 29 * 它是构建核心容器时,创建对象采取的策略是采用延迟加载的方式。也就是说,什么时候只要根据id获取对象,什么时候才真正的创建对象。 30 * 31 */ 32 @Test 33 public void method01(){ 34 /*1、获取核心容器对象*/ 35 ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml"); 36 User2 user2 = ac.getBean("user2", User2.class); 37 user2.save(); 38 } 39 }
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans 5 http://www.springframework.org/schema/beans/spring-beans.xsd"> 6 7 <!-- 把对象的创建交给spring来管理 --> 8 <!-- spring对bean的管理细节 9 1、创建 bean 的三种方式 10 2、bean对象的作用范围 11 3、bean对象的生命周期 12 --> 13 14 <!-- 创建 bean 的三种方式 --> 15 <!--第一种方式:使用默认构造创建 16 在spring的配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签时。 17 采用的就是默认构造函数创建bean对象,此时如果类中没有默认构造函数,则对象无法创建。 18 --> 19 <!--<bean id="user" class="com.oracle.pojo.User"/>--> 20 21 <!-- 第二种方式:使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器) --> 22 <!--<bean id="instanceFactory" class="com.oracle.factory.InstanceFactory"/> 23 <bean id="user" factory-bean="instanceFactory" factory-method="getUser"/>--> 24 25 <!-- 第三种方式:使用工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入spring容器) --> 26 <!-- <bean id="user" class="com.oracle.factory.StaticFactoty" factory-method="getUser"/>--> 27 28 <!-- Bean的作用范围调整 29 bean标签的scope属性: 30 作用:用于指定bean的作用范围 31 取值:常用的就是单例的和多例的 32 singleton:单例的(默认值) 33 prototype::多例的 34 request:作用于web应用的请求范围 35 session:作用于web应用的会话范围 36 global-session:作用于集群环境的会话范围(全局会话范围),当不是集群范围环境时,它就是session 37 --> 38 <!--<bean id="user" class="com.oracle.factory.StaticFactoty" factory-method="getUser" scope="singleton"/>--> 39 40 <!-- bean对象的生命周期 41 单例模式: 42 出生:当容器创建时对象出生 43 活着:只要容器还在,对象一直活着 44 死亡:容器销毁,对象消亡 45 总结:单例对象的生命周期和容器相同 46 多例模式: 47 出生:当我们使用对象时spring框架为我们创建 48 活着:对象只要是在使用过程中就一直活着 49 死亡:当对象长时间不用,且没有别的对象引用时,由java的垃圾回收器回收 50 --> 51 <!--<bean id="user" class="com.oracle.factory.InstanceFactory" scope="prototype" init-method="init" destroy-method="destroy"/> 52 --> 53 <!-- spring中的依赖注入 54 一、依赖注入: 55 Dependency Injection 56 二、IOC的作用: 57 降低程序减的耦合(依赖关系) 58 三、依赖关系的管理: 59 以后都交给spring来维护 60 四、在当前类需要用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明 61 五、依赖关系的维护(依赖注入) 62 1.依赖注入: 63 a)、能注入的数据:有三类 64 基本类型和spring 65 其他bean类型(在配置文件中或者注解配置过的bean) 66 复杂类型/集合类型 67 b)、注入的方式:有三种 68 第一种:使用构造函数提供 69 第二种:使用set方法提供 70 第三种:使用注解提供 71 --> 72 73 <!-- 构造函数注入: 74 使用的标签:constructor-arg 75 标签出现的位置:bean标签的内部 76 标签中的属性: 77 type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个或某些参数的类型 78 index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值。索引的位置是从 0 开始 79 name:用于指定给构造函数中指定名称的参数赋值 80 =============以上三个用于指定给构造函数中哪个参数赋值===================== 81 value:用于给基本类型和 String 类型赋值 82 ref:用于指定其他bean类型数据。他指的就是在spring的ioc核心容器中出现过的bean对象 83 84 优势: 85 在获取bean对象是,注入数据是必须的操作,否则对象无法创建成功。 86 弊端: 87 改变了bean对象的实例化方法,使我们在创建对象时,如果用不到这些数据,也必须提供。 88 89 --> 90 <!-- <bean id="user" class="com.oracle.pojo.User"> 91 <constructor-arg name="name" value="张三"></constructor-arg> 92 <constructor-arg name="age" value="18"></constructor-arg> 93 <constructor-arg name="brithday" ref="now"></constructor-arg> 94 </bean> 95 96 <bean name="now" class="java.util.Date"></bean>--> 97 98 <!-- set方法注入 更常用的方法 99 涉及的标签:property 100 出现的位置:bean标签的内部 101 标签的属性: 102 name:用于指定注入时所调用的set方法名称 103 value:用于给基本类型和 String 类型赋值 104 ref:用于指定其他bean类型数据。他指的就是在spring的ioc核心容器中出现过的bean对象 105 106 优势:创建对象时没有明确的限制,可以直接使用默认构造函数 107 弊端:如果有某个成员必须有值,则获取对象时有可能set方法没有执行 108 --> 109 <bean id="user" class="com.oracle.pojo.User"> 110 <property name="name" value="test"></property> 111 <property name="age" value="20"></property> 112 <property name="brithday" ref="now"></property> 113 </bean> 114 <bean name="now" class="java.util.Date"></bean> 115 116 <!-- 复杂类型注入,集合类型注入 117 用于给List结构集合注入的标签: 118 list,array,set 119 用于给Map结构集合注入的标签: 120 map,props 121 结构相同,标签可以互换 122 --> 123 <bean id="user2" class="com.oracle.pojo.User2"> 124 <property name="arrs"> 125 <array> 126 <value>杨</value> 127 <value>淏</value> 128 <value>宇</value> 129 </array> 130 </property> 131 <property name="list"> 132 <list> 133 <value>赵</value> 134 <value>六</value> 135 </list> 136 </property> 137 <property name="mySet"> 138 <set> 139 <value>王</value> 140 <value>五</value> 141 </set> 142 </property> 143 <property name="map"> 144 <map> 145 <entry key="testA" value="AAA"></entry> 146 <entry key="testB" value="BBB"></entry> 147 </map> 148 </property> 149 <property name="properties"> 150 <props> 151 <prop key="testC">CCC</prop> 152 </props> 153 </property> 154 </bean> 155 156 </beans>