Bean的实例化有三种方式:
<bean id="bean1" class="com.seven.entity.Bean1"/>
准备一个静态工厂:
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"/>
准备一个实例工厂:
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起名称,通过这个名称可以得到这个bean。
注意:不能包含特殊符号。
作用:与id属性的作用一样。
注意:与id的区别是,可以包含特殊符号。
作用:指定该bean的全限定类名。
作用:设置该bean的作用范围,默认是单例。
可取值:
(1)singleton:默认值,单例。
(2)prototype:多例。
(3)request:WEB项目中,spring创建一个bean的对象,将对象存入到request域中。
(4)session:WEB项目中,spring创建一个bean的对象,将对象存入到session域中。
(5)globalSession:WEB项目中,运行在Porlet环境中,如果没有Porlet环境,则相当于是session。
测试一下:
spring配置文件:
<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">
<bean id="person1" class="com.seven.bean.Person"/>
<bean name="person2_" class="com.seven.bean.Person"/>
<bean id="person3" class="com.seven.bean.Person" scope="singleton"/>
<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 id="person1" class="com.seven.bean.Person">
<constructor-arg value="通过带参数的构造函数注入属性"/>
bean>
constructor-arg标签的属性:
<constructor-arg value="属性值" name="属性名" type="属性类型" ref="属性的映射" index="属性标号"/>
2.1 通过set方法注入简单的属性
<bean id="person2" class="com.seven.bean.Person">
<property name="name" value="通过set方法注入简单的属性"/>
bean>
<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>
<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>
<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>
<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>
<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>
<bean id="person8" class="com.seven.bean.Person">
<property name="name" value="通过set方法注入复杂类型属性。。。properties"/>
<property name="properties">
<props>
<prop key="username">rootprop>
<prop key="password">tigerprop>
props>
property>
bean>
<bean id="person9" class="com.seven.bean.Person" p:name="通过p名称空间注入属性"/>