一、Bean的实例化方式
Bean的实例化有三种方式:
- 通过构造函数实例化(常用)
- 通过静态工厂实例化
- 通过实例工厂实例化
1. 通过构造函数实例化(常用)
<bean id="bean1" class="com.seven.entity.Bean1"/>
2. 通过静态工厂实例化
准备一个静态工厂:
package com.seven.factory;
import com.seven.entity.Bean2;
public class Bean2StaFactory {
public static Bean2 getBean2() {
Bean2 bean2 = new Bean2();
bean2.setMsg("通过【静态工厂】实例化的Bean2对象");
return bean2;
}
}
spring配置文件:
<bean id="bean2" class="com.seven.factory.Bean2StaFactory" factory-method="getBean2"/>
3. 通过实例工厂实例化
准备一个实例工厂:
package com.seven.factory;
import com.seven.entity.Bean3;
public class Bean3Factory {
public Bean3 getBean3() {
Bean3 bean3 = new Bean3();
bean3.setMsg("通过【实例工厂】实例化的Bean3对象");
return bean3;
}
}
spring配置文件:
<bean id="bean3Factory" class="com.seven.factory.Bean3Factory"/>
<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"/>
二、Bean的常用属性
- id
- name
- class
- scope
1. id
作用:给bean起名称,通过这个名称可以得到这个bean。
注意:不能包含特殊符号。
2. name
作用:与id属性的作用一样。
注意:与id的区别是,可以包含特殊符号。
3. class
作用:指定该bean的全限定类名。
4. scope
作用:设置该bean的作用范围,默认是单例。
可取值:
(1)singleton:默认值,单例。
(2)prototype:多例。
(3)request:WEB项目中,spring创建一个bean的对象,将对象存入到request域中。
(4)session:WEB项目中,spring创建一个bean的对象,将对象存入到session域中。
(5)globalSession:WEB项目中,运行在Porlet环境中,如果没有Porlet环境,则相当于是session。
测试一下:
spring配置文件:
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- id属性,class属性 -->
<bean id="person1" class="com.seven.bean.Person"/>
<!-- name属性 -->
<bean name="person2_" class="com.seven.bean.Person"/>
<!-- scope属性:单例 -->
<bean id="person3" class="com.seven.bean.Person" scope="singleton"/>
<!-- scope属性:多例 -->
<bean id="person4" class="com.seven.bean.Person" scope="prototype"/>
</beans>
测试类:
import com.seven.bean.Person;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AttributeTest {
private ApplicationContext context;
@Before
public void init() {
context = new ClassPathXmlApplicationContext("spring.config.xml");
}
@Test
public void test() {
//测试id
Person person1 = (Person) context.getBean("person1");
System.out.println("person1 --> " + person1);
//测试name
Person person2 = (Person) context.getBean("person2_");
System.out.println("person2 --> " + person2.getName());
//测试scope
//1.单例
Person person31 = (Person) context.getBean("person3");
Person person32 = (Person) context.getBean("person3");
System.out.println("单例的Bean --> " + (person31 == person32));
//2.多例
Person person41 = (Person) context.getBean("person4");
Person person42 = (Person) context.getBean("person4");
System.out.println("多例的Bean --> " + (person41 == person42));
}
}
运行结果:
单例和多例还要注意一下Bean分别是什么时候被创建的!!!
三、Bean的属性注入
Bean的属性注入有两种方式:
- 通过带参的构造函数注入。
- 通过set方法注入。(常用)
1.通过带参的构造函数注入
<bean id="person1" class="com.seven.bean.Person">
<constructor-arg value="通过带参数的构造函数注入属性"/>
</bean>
constructor-arg标签的属性:
<constructor-arg value="属性值" name="属性名" type="属性类型" ref="属性的映射" index="属性标号"/>
2.通过set方法注入
2.1 通过set方法注入简单的属性
<bean id="person2" class="com.seven.bean.Person">
<property name="name" value="通过set方法注入简单的属性"/>
</bean>
2.2 通过set方法注入对象类型属性
<bean id="person3" class="com.seven.bean.Person">
<property name="name" value="通过set方法注入对象类型属性"/>
<property name="card" ref="card3"/>
</bean>
<bean id="card3" class="com.seven.bean.Card">
<property name="cardnum" value="123123123"/>
</bean>
3.3 通过set方法注入复杂类型属性
<!-- 通过set方法注入复杂类型属性。。。list -->
<bean id="person4" class="com.seven.bean.Person">
<property name="name" value="通过set方法注入复杂类型属性。。。list"/>
<property name="list">
<list>
<value>一</value>
<value>二</value>
<value>三</value>
<value>一</value>
</list>
</property>
</bean>
<!-- 通过set方法注入复杂类型属性。。。set -->
<bean id="person5" class="com.seven.bean.Person">
<property name="name" value="通过set方法注入复杂类型属性。。。list"/>
<property name="set">
<set>
<value>一</value>
<value>二</value>
<value>三</value>
<value>一</value>
</set>
</property>
</bean>
<!-- 通过set方法注入复杂类型属性。。。arrs -->
<bean id="person6" class="com.seven.bean.Person">
<property name="name" value="通过set方法注入复杂类型属性。。。arrs"/>
<property name="arrs">
<array>
<value>一</value>
<value>二</value>
<value>三</value>
<value>一</value>
</array>
</property>
</bean>
<!-- 通过set方法注入复杂类型属性。。。map -->
<bean id="person7" class="com.seven.bean.Person">
<property name="name" value="通过set方法注入复杂类型属性。。。map"/>
<property name="map">
<map>
<entry key="username" value="root"/>
<entry key="password" value="tiger"/>
<entry key="username" value="root"/>
</map>
</property>
</bean>
<!-- 通过set方法注入复杂类型属性。。。properties -->
<bean id="person8" class="com.seven.bean.Person">
<property name="name" value="通过set方法注入复杂类型属性。。。properties"/>
<property name="properties">
<props>
<prop key="username">root</prop>
<prop key="password">tiger</prop>
</props>
</property>
</bean>
更新时间:2020-1-18
来源:CSDN
作者:SevenSongyun
链接:https://blog.csdn.net/SevenSongyun/article/details/104031325