<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 注册一个Person对象,Spring会自动创建这个Person对象 -->
<!--
一个Bean标签可以注册一个组件(对象、类)
class:写要注册的组件的全类名
id:这个对象的唯一标示;
-->
<bean id="person01" class="com.atguigu.bean.Person">
<!--使用property标签为Person对象的属性赋值
name="lastName":指定属性名
value="张三":为这个属性赋值
-->
<property name="lastName" value="张三"></property>
<property name="age" value="18"></property>
<property name="email" value="zhangsan@atguigu.com"></property>
<property name="gender" value="男"></property>
</bean>
<bean id="person02" class="com.atguigu.bean.Person">
<property name="lastName" value="小花"></property>
</bean>
<bean id="person03" class="com.atguigu.bean.Person">
<!-- 调用有参构造器进行创建对象并赋值;掌握 -->
<!-- public Person(String lastName, Integer age, String gender, String email) -->
<constructor-arg name="lastName" value="小明"></constructor-arg>
<constructor-arg name="email" value="xiaoming@atguigu.com"></constructor-arg>
<constructor-arg name="gender" value="男"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
</bean>
<!--可以省略name属性,严格按照构造器参数的位置 -->
<bean id="person04" class="com.atguigu.bean.Person">
<constructor-arg value="小花"></constructor-arg>
<constructor-arg value="18"></constructor-arg>
<!-- index="3":为参数指定索引,从0开始 -->
<constructor-arg value="xiaohua@atguigu.com" index="3"></constructor-arg>
<constructor-arg value="男" index="2"></constructor-arg>
</bean>
<!--public Person(String lastName, Integer age, String gender) -->
<!--public Person(String lastName, String email, String gender) -->
<!-- 重载的情况下type可以指定参数的类型 -->
<bean id="person05" class="com.atguigu.bean.Person">
<constructor-arg value="小丽"></constructor-arg>
<constructor-arg value="10" index="1" type="java.lang.Integer"></constructor-arg>
<constructor-arg value="男"></constructor-arg>
</bean>
<!-- 通过p名称空间为bean赋值;导入p名称空间 -->
<!--名称空间:在xml中名称空间是用来防止标签重复的 -->
<!--1)、导入p名称空间 2)、写带前缀的标签/属性 -->
<!--
<book>
<b:name>西游记</b:name>
<price>19.98</price>
<author>
<a:name>吴承恩</a:name>
<gender>男</gender>
</author>
</book>
带前缀的标签<c:forEach> <jsp:forward>
-->
<bean id="person06" class="com.atguigu.bean.Person"
p:age="18" p:email="xiaoming@atguigu.com"
p:lastName="哈哈" p:gender="男">
</bean>
</beans>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<!-- 实验4:正确的为各种属性赋值 测试使用null值 、 引用类型赋值(引用其他bean、引用内部bean) 集合类型赋值(List、Map、Properties)、
util名称空间创建集合类型的bean 级联属性赋值 -->
<bean id="car01" class="com.atguigu.bean.Car">
<property name="carName" value="宝马"></property>
<property name="color" value="绿色"></property>
<property name="price" value="30000"></property>
</bean>
<bean id="person01" class="com.atguigu.bean.Person">
<!-- lastName="null" -->
<property name="lastName">
<!-- 进行复杂的赋值 -->
<null />
</property>
<!-- ref:代表引用外面的一个值 ;引用其他bean car = ioc.getBean("car01") -->
<!-- <property name="car" ref="car01"></property> -->
<property name="car">
<!--对象我们可以使用bean标签创建 car = new Car(); 引用内部bean;不能被获取到,只能内部使用 -->
<bean class="com.atguigu.bean.Car">
<property name="carName" value="自行车"></property>
</bean>
</property>
</bean>
<bean id="book01" class="com.atguigu.bean.Book">
<property name="bookName" value="东游记"></property>
</bean>
<bean id="person02" class="com.atguigu.bean.Person">
<!-- 如何为list类型赋值 -->
<property name="books">
<!-- books = new ArrayList<Book>(); -->
<list>
<!-- list标签体中添加每一个元素 -->
<bean class="com.atguigu.bean.Book" p:bookName="西游记"></bean>
<!-- 引用外部一个元素 -->
<ref bean="book01" />
</list>
</property>
<!-- Map<String, Object> maps; -->
<property name="maps">
<!-- maps = new LinkedHashMap<>(); -->
<map>
<!-- 一个entry代表一个键值对 -->
<entry key="key01" value="张三"></entry>
<entry key="key02" value="18"></entry>
<entry key="key03" value-ref="book01"></entry>
<entry key="key04">
<bean class="com.atguigu.bean.Car">
<property name="carName" value="宝马"></property>
</bean>
</entry>
<entry key="key05">
<value>李四</value>
</entry>
<!-- <entry key="key05"> <map></map> </entry> -->
</map>
</property>
<!-- private Properties properties; -->
<property name="properties">
<!-- properties = new Properties();所有的k=v都是string -->
<props>
<!-- k=v都是string;值直接写在标签体中 -->
<prop key="username">root</prop>
<prop key="password">123456</prop>
</props>
</property>
</bean>
<!-- util名称空间创建集合类型的bean;方便别人引用 -->
<bean id="person03" class="com.atguigu.bean.Person">
<!-- <property name="maps" ></property> -->
<property name="maps" ref="myMap"></property>
</bean>
<!-- 相当于new LinkedHashMap<>() -->
<util:map id="myMap">
<!-- 添加元素 -->
<entry key="key01" value="张三"></entry>
<entry key="key02" value="18"></entry>
<entry key="key03" value-ref="book01"></entry>
<entry key="key04">
<bean class="com.atguigu.bean.Car">
<property name="carName" value="宝马"></property>
</bean>
</entry>
<entry key="key05">
<value>李四</value>
</entry>
</util:map>
<!-- 解释:4个元素
[[],Person,12,{}]
-->
<util:list id="myList">
<list></list>
<bean class="com.atguigu.bean.Person"></bean>
<value>12</value>
<ref bean="myMap"/>
</util:list>
<!-- 级联属性赋值: 级联属性:属性的属性-->
<bean id="person04" class="com.atguigu.bean.Person">
<!--为car赋值的时候。改变car的价格 -->
<property name="car" ref="car01"></property>
<!-- -->
<property name="car.price" value="900000"></property>
</bean>
<!--
实验6:通过继承实现bean配置信息的重用
实验7:通过abstract属性创建一个模板bean
实验8:bean之间的依赖
实验9:测试bean的作用域,分别创建单实例和多实例的bean★
-->
<!-- abstract="true":这个bean的配置是一个抽象的,不能获取他的实例,只能被别人用来继承 -->
<bean id="person05" class="com.atguigu.bean.Person" abstract="true">
<property name="lastName" value="张三"></property>
<property name="age" value="18"></property>
<property name="gender" value="男"></property>
<property name="email" value="zhangsan@atguigu.com"></property>
</bean>
<!--parent:指定当前bean的配置信息继承于哪个 -->
<bean id="person06" class="com.atguigu.bean.Person" parent="person05">
<property name="lastName" value="李四"></property>
</bean>
</beans>
<?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 -->
<!-- 改变bean的创建顺序 -->
<!--实验8:bean之间的依赖(只是改变创建顺序) -->
<bean id="car" class="com.atguigu.bean.Car" depends-on="person"></bean>
<bean id="person" class="com.atguigu.bean.Person"></bean>
<!-- 实验9:测试bean的作用域,分别创建单实例和多实例的bean★
bean的作用域:指定bean是否单实例,xxx;默认:单实例的
prototype:多实例的;
1)、容器启动默认不会去创建多实例bean
2)、获取的时候创建这个bean
3)、每次获取都会创建一个新的对象
singleton:单实例的;默认的;
1)、在容器启动完成之前就已经创建好对象,保存在容器中了。
2)、任何获取都是获取之前创建好的那个对象;
request:在web环境下,同一次请求创建一个Bean实例(没用)
session:在web环境下,同一次会话创建一个Bean实例(没用)
-->
<bean id="book" class="com.atguigu.bean.Book" scope="prototype"></bean>
<!--实验5:配置通过静态工厂方法创建的bean、实例工厂方法创建的bean、FactoryBean★ -->
<!-- bean的创建默认就是框架利用反射new出来的bean实例 -->
<!-- 工厂模式;工厂帮我们创建对象;有一个专门帮我们创建对象的类,这个类就是工厂
AirPlane ap = AirPlaneFactory.getAirPlane(String jzName);
静态工厂:工厂本身不用创建对象;通过静态方法调用,对象 = 工厂类.工厂方法名();
实例工厂:工厂本身需要创建对象;
工厂类 工厂对象 = new 工厂类();
工厂对象.getAirPlane("张三");
-->
<!-- 1、静态工厂(不需要创建工厂本身)factory-method="getAirPlane":
指定哪个方法是工厂方法
class:指定静态工厂全类名
factory-method:指定工厂方法
constructor-arg:可以为方法传参
-->
<bean id="airPlane01" class="com.atguigu.factory.AirPlaneStaticFactory"
factory-method="getAirPlane">
<!-- 可以为方法指定参数 -->
<constructor-arg value="李四"></constructor-arg>
</bean>
<!--2、实例工厂使用
factory-method;指定这个实例工厂中哪个方法是工厂方法;
-->
<bean id="airPlaneInstanceFactory"
class="com.atguigu.factory.AirPlaneInstanceFactory"></bean>
<!-- factory-bean:指定当前对象创建使用哪个工厂
1、先配置出实例工厂对象
2、配置我们要创建的AirPlane使用哪个工厂创建
1)、factory-bean:指定使用哪个工厂实例
2)、factory-method:使用哪个工厂方法
-->
<bean id="airPlane02" class="com.atguigu.bean.AirPlane"
factory-bean="airPlaneInstanceFactory"
factory-method="getAirPlane">
<constructor-arg value="王五"></constructor-arg>
</bean>
<!-- FactoryBean★(是Spring规定的一个接口);
只要是这个接口的实现类,Spring都认为是一个工厂;
1、ioc容器启动的时候不会创建实例
2、FactoryBean;获取的时候的才创建对象
-->
<bean id="myFactoryBeanImple"
class="com.atguigu.factory.MyFactoryBeanImple"></bean>
</beans>