Spring5学习笔记(三)IOC基本掌握知识点、属性赋值、依赖注入

Spring系列专栏,之后的日子会持续发布,有兴趣的小伙伴可以关注收藏哦!
Spring系列教程

小技巧

private ApplicationContext application = new ClassPathXmlApplicationContext("ioc.xml");

@Test
public void test02() {
	Person bean = application.getBean(Person.class);
	System.out.println(bean);
}

如果ioc容器中这个类型的bean有多个,查找就会报错
org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException:

所以可以根据id来查找,就不会报错

private ApplicationContext application = new ClassPathXmlApplicationContext("ioc.xml");
@Test
public void test02() {		
	Person bean1 = application.getBean("person02",Person.class);
	System.out.println(bean1);		
}

好处:这样操作不用类型转换


1、Spring依赖注入

1.1、setter方式注入

指 IoC 容器使用 setter 方法注入被依赖的实例。通过调用无参构造器或无参 static 工厂方法实例化 bean 后,调用该 bean 的 setter 方法,即可实现基于 setter 的 DI。

<bean id="person01" class="com.dong.Person">
	<!-- 使用property标签为Person对象赋值 name = "lastName" : 指定属性名 value = "李四" : 为该属性赋值 -->
	<property name="lastName" value="李四"></property>
	<property name="age" value="20"></property>
	<property name="gender" value="男"></property>
	<property name="email" value="lisi@qq.com"></property>
</bean>


@Test
public void test02() {
Person bean = (Person)application.getBean("person01");
	System.out.println(bean);
}

在这里插入图片描述

1.2、构造方法注入(推荐)

指 IoC 容器使用构造方法注入被依赖的实例。基于构造器的 DI 通过调用带参数的构造方法实现,每个参数代表一个依赖

第一种方法(推荐)

//Person类

public class Person {

	private String lastName;
	private Integer age;
	private String gender;
	private String email;
	
	
	public Person() {
		super();
		System.out.println("无参构造器");
	}
	public Person(String lastName, Integer age, String gender, String email) {
		super();
		this.lastName = lastName;
		this.age = age;
		this.gender = gender;
		this.email = email;
		System.out.println("有参构造器。。");
	}
	//.....省略getter/setter方法和tostring方法
}


//ioc.xml
<bean id="person03" class="com.dong.Person">
	<!-- 调用有参构造器进行创建对象并赋值 -->
	<!-- <constructor-arg>构造器参数,写几个就是调用几个参数的构造器方法 -->
	<constructor-arg name="lastName" value="皮皮虾"></constructor-arg>
	<constructor-arg name="age" value="18"></constructor-arg>
	<constructor-arg name="gender" value="男"></constructor-arg>
	<constructor-arg name="email" value="皮皮虾@qq.com"></constructor-arg>
</bean>

//test
@Test
public void test03() {		
	Person bean = (Person)application.getBean("person03");
	System.out.println(bean);
}

在这里插入图片描述


第二种方法

<bean id="person04" class="com.dong.Person">
	<!--可以不指定name属性,但顺序要按照有参构造器参数顺序来,
		结果会正常输出,但如果不安正常顺序来,也会输出,
		但value值会赋给当前索引对应的构造器参数,这时候如果
		想要赋值正确,可以加上index参数来指定索引
	-->
	<constructor-arg value="皮皮虾"></constructor-arg>
	<constructor-arg value="18"></constructor-arg>
	<constructor-arg value="男"></constructor-arg>
	<constructor-arg value="皮皮虾@qq.com"></constructor-arg>
</bean>

第三种方法

//指定索引
<bean id="person04" class="com.dong.Person">
	<!-- 调用有参构造器进行创建对象并赋值 -->
	<!-- <constructor-arg>构造器参数,写几个就是调用几个参数的构造器方法 -->
	<!--index索引默认从0开始-->
	<constructor-arg value="皮皮虾"></constructor-arg>
	<constructor-arg value="男" index = "2"></constructor-arg>
	<constructor-arg value="皮皮虾@qq.com" index = "3"></constructor-arg>
	<constructor-arg value="18" index = "1"></constructor-arg>
</bean>

第四种方法

//如果出现构造器重载,在index索引无法解决的情况下,我们可以指定type类型来精准赋值
publicPerson(String lastName, Integer age, String email) {
	super();
	this.lastName = lastName;
	this.age = age;
	this.email = email;
}
	
public Person(String lastName, String email, Integer age) {
	super();
	this.lastName = lastName;
	this.age = age;
	this.email = email;
}
	
<bean id="person05" class="com.dong.Person">
	<!-- 调用有参构造器进行创建对象并赋值 -->
	<!-- <constructor-arg>构造器参数,写几个就是调用几个参数的构造器方法 -->
	<constructor-arg value="皮皮虾@qq.com"></constructor-arg>
	<constructor-arg value="18" type="java.lang.Integer"></constructor-arg>
	<constructor-arg value="皮皮虾"></constructor-arg>
</bean>

1.3、通过p名称空间为bean赋值

导入名称空间
在这里插入图片描述
在这里插入图片描述
导入成功
在这里插入图片描述

由于我用的是STS,如果是idea的话
直接在xml上加xmlns:p="http://www.springframework.org/schema/p"就行了

使用

<bean id="person6" class="com.dong.Person" p:age="18" p:lastName="小米" p:email="qq@qq.com" p:gender="男">
</bean>


@Test
public void test02() {		
	Person bean = (Person)application.getBean("person6");
	System.out.println(bean);	
}

运行成功
在这里插入图片描述


总结:property为setter方式注入,constructor-arg为构造方法注入。

2、各种属性赋值

2.1、赋null值

<!--如果想要给属性值赋null的话,是不能在value属性中写null的
	真正的赋null值是在标签内写null标签的
-->
<bean id="person7" class="com.dong.Person">
	<property name="lastName">
		<null/>
	</property>
</bean>

在这里插入图片描述

2.2、 ref引用

2.2.1、 引用外部
//Car
public class Car {

	private String name;
	private String color;
	private Integer price;
	//省略。。。。
}

//Person
public class Person {

	private String lastName;
	private Integer age;
	private String gender;
	private String email;
	private Car car;
	//省略。。。
}
<!--xml-->
<bean id="car01" class="com.dong.Car">
<property name="name" value = "宝马"></property>
	<property name="color" value = "黑色"></property>
	<property name="price" value = "300000"></property>
</bean>
<!-- ref:代表引用外面的一个值 -->
<bean id="person1" class="com.dong.Person">
	<property name="lastName" value = "小花"></property>
	<property name="car" ref="car01"></property>
</bean>

在这里插入图片描述


2.2.2、 引用内部
<bean id="person1" class="com.dong.Person">
<property name="lastName" value = "小花"></property>
	<property name="car">
		<!-- 对象我们可以用bean标签创建 -->
		<bean class="com.dong.Car">
			<property name="name" value="自行车"></property>
		</bean>
	</property>
</bean>

在这里插入图片描述


2.3、list属性赋值

//Person
public class Person {

	private String lastName;
	private Integer age;
	private String gender;
	private String email;
	private Car car;
	//普通list
	private List<String> text; 
	//对象List
	//private List<对象> xxx;
}
<bean id="person2" class="com.dong.Person">
	<property name="text">
		<list>
			<!--普通list可通过value标签赋值-->
			<value>1</value>
			<value>2</value>
			<value>3</value>
			<!--如果是对象类型的List
			那么可在list标签中写bean标签注明class通过赋值
			也可通过ref进行外部引用
			-->
		</list>
	</property>
</bean>

在这里插入图片描述

注意:内部bean是不能通过id值进行获取的


2.4、map属性赋值

//Person
public class Person {

	private String lastName;
	private Integer age;
	private String gender;
	private String email;
	private Car car;
	private List<String> text; 
	//map
	private Map<String, Object> maps;
	//省略。。。
}

//xml
<bean id="person2" class="com.dong.Person">
	<property name="maps">
		<map>
			<entry key="key1" value="李四"></entry>
			<entry key="key2" value="21"></entry>
			<entry key="key3" value="11123546"></entry>
			<!-- value-ref注入外部值 -->
			<entry key="key3" value-ref="car01"></entry>
			<!--
				<entry key="key4"> 
					<bean class="com.dong.Car">
						<property name="name" value="奔驰"></property>
					</bean>
				</entry> 
			-->
			<!-- 
				map里面可以套map
				<bean key="key5">
					<map></map>
				</bean>
			 -->
			
		</map>
	</property>
</bean>

在这里插入图片描述

2.5、properties属性赋值

//person
public class Person {

	private String lastName;
	private Integer age;
	private String gender;
	private String email;
	private Car car;
	private List<String> text; 
	private Map<String, Object> maps;
	//Properties类型
	private Properties properties;
	
	//省略。。。
}

//xml
<bean id="person3" class="com.dong.Person">
	<property name="properties">
		<props>
			<prop key="username">root</prop>
			<prop key="password">123456</prop>
		</props>
	</property>
</bean>

prop标签没有value属性,所以属性值写在标签内

在这里插入图片描述

2.6、util名称空间创建集合类型bean,方便别人使用

在这里插入图片描述

<!-- id必须写 -->
<util:map id="myMap">
	<entry key="key1" value="李四"></entry>
	<entry key="key2" value="21"></entry>
	<entry key="key3" value="11123546"></entry>
	<!-- value-ref注入外部值 -->
	<entry key="key3" value-ref="car01"></entry>
	<!-- <entry key="key4"> <bean class="com.dong.Car"> <property name="name" 
		value="奔驰"></property> </bean> </entry> -->
	<!-- map里面可以套map <bean key="key5"> <map></map> </bean> -->
</util:map>

<bean id="person2" class="com.dong.Person">
	<!-- <property name="text"> <list> <value>1</value> <value>2</value> <value>3</value> 
		<array></array> </list> </property> -->
	<--引用 <util:map id="myMap"> -->
	<property name="maps" ref="myMap">
	</property>
</bean>

在这里插入图片描述

2.7、级联属性赋值

<!-- 级联属性赋值  级联属性:属性的属性 -->
<bean id="person4" class="com.dong.Person">
	<!-- 为car赋值的时候,改变car的价格 ,引用中的价格为300000-->
	<!--ref为引用,是地址-->
	<property name="car" ref="car01"></property>
	<!--  -->
	<property name="car.price" value="900000"></property>
</bean>

在这里插入图片描述

3、通过继承实现bean配置信息的重用

<!-- 继承bean实现重用 -->
<bean id="person001" class="com.dong.Person">
	<!-- 使用property标签为Person对象赋值 name = "lastName" : 指定属性名 value = "李四" : 为该属性赋值 -->
	<property name="lastName" value="李四"></property>
	<property name="age" value="20"></property>
	<property name="gender" value="男"></property>
	<property name="email" value="lisi@qq.com"></property>
</bean>

<!-- parent:指定当前bean的配置信息继承于哪个 -->
<bean id="person002" class="com.dong.Person" parent="person001">
	<!--最新属性值以该bean为准,其余的继承于person001-->
	<property name="lastName" value="张三"></property>
</bean>

@Test
public void test02() {		
	Person bean = (Person)application.getBean("person002");
	System.out.println(bean);	
}

在这里插入图片描述


最后送个大家元素的常用属性常用属性表

属性名称描述
id是一个 Bean 的唯一标识符,Spring 容器对 Bean 的配置和管理都通过该属性完成
nameSpring 容器同样可以通过此属性对容器中的 Bean 进行配置和管理,name 属性中可以为 Bean 指定多个名称,每个名称之间用逗号或分号隔开
class该属性指定了 Bean 的具体实现类,它必须是一个完整的类名,使用类的全限定名
scope用于设定 Bean 实例的作用域,其属性值有 singleton(单例)、prototype(原型)、request、session 和 global Session。其默认值是 singleton
constructor-arg<bean>元素的子元素,可以使用此元素传入构造参数进行实例化。该元素的 index 属性指定构造参数的序号(从 0 开始),type 属性指定构造参数的类型
property<bean>元素的子元素,用于调用 Bean 实例中的 Set 方法完成属性赋值,从而完成依赖注入。该元素的 name 属性指定 Bean 实例中的相应属性名
ref<property> 和 <constructor-arg> 等元素的子元索,该元素中的 bean 属性用于指定对 Bean 工厂中某个 Bean 实例的引用
value<property> 和 <constractor-arg> 等元素的子元素,用于直接指定一个常量值
list用于封装 List 或数组类型的依赖注入
set用于封装 Set 类型属性的依赖注入
map用于封装 Map 类型属性的依赖注入
entry<map> 元素的子元素,用于设置一个键值对。其 key 属性指定字符串类型的键值,ref 或 value 子元素指定其值

觉得写的不错的小伙伴,可以点赞关注和收藏哦,博主会持续发布与大家共同学习!

Java学习路线目录索引
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值