spring Bean配置及使用

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

<?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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值