目录
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 的配置和管理都通过该属性完成 |
name | Spring 容器同样可以通过此属性对容器中的 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 子元素指定其值 |
觉得写的不错的小伙伴,可以点赞关注和收藏哦,博主会持续发布与大家共同学习!