WUJUNWEI'S BLOG
WuJunwei
Jul 2, 2020
It takes 12 minutes to read this article.

内部Bean的使用,工厂实例方法创建Bean,工厂实例方法创建Bean,自动注入,Bean的单例和多例

IOC之静态工厂方法创建Bean

实验15:配置通过静态工厂方法创建的bean

创建Person的工厂类

public class PersonFactory {

	public static Person createPerson() {
		return new Person(15, "静态工厂方法创建的bean对象", null);
	}
	
}

在applicationContext.xml中的配置:

  • 配置调用静态工厂方法创建Bean对象
  • class 配置工厂类的全类名
  • factory-method 调用工厂类的哪个方法

IOC之工厂实例方法创建Bean

public class PersonFactory {
	
	public Person createPerson2() {
		return new Person(16, "工厂实例方法创建的bean对象", null);
	}
	
}

applicationContext.xml中的配置

  1. 在spring容器中创建一个bean对象
  2. 配置调用工厂实例的方法

    <!– class属性和factory-method组合是静态工厂方法 factory-bean 和 factory-method 组合是工厂实例方法

     factory-bean 使用哪个bean对象做为工厂实例
     factory-method 调用工厂类实例的哪个方法   -->
    

IOC之FactoryBean接口方式创建对象

实验17:配置FactoryBean接口创建Bean对象

实现FactoryBean接口

public class PersonFacotryBean implements FactoryBean<Person> {
	/**
	 * 创建bean对象的方法
	 */
	@Override
	public Person getObject() throws Exception {
		return new Person(17, "这是FactoryBean接口创建的bean", null);
	}
	/**
	 * 获取bean的具体类型的方法
	 */
	@Override
	public Class<?> getObjectType() {
		return Person.class;
	}
	/**
	 * 判断是否是单例的方法
	 */
	@Override
	public boolean isSingleton() {
		return true;
	}

}

applicationContext.xml配置文件

如果指定的Class是实现了Spring的FactoryBean接口, Spring容器本身会自动的判断,如果有实现这个FactoryBean接口, 创建对象的时候,就会调用 getObject()返回对象

<bean id="p17" class="com.atguigu.factory.PersonFacotryBean"></bean>

IOC之继承Bean配置

<bean id="parent" class="com.ncu.zte.Person">
	<property name="id" value="100" />
	<property name="name" value="我是父亲" />
	<property name="list">
		<list>
			<value>list1</value>
			<value>list2</value>
			<value>list3</value>
		</list>
	</property>
</bean>
<!-- parent属性设置你要继承哪个id的配置 -->
<bean id="p19" class="com.ncu.zte.Person" parent="parent">
	<property name="name" value="我是子"></property>
</bean>

IOC之abstract抽象Bean

abstract的bean配置,就是为了让其他的bean做继承使用。而不能实例化

实验19:通过abstract属性创建一个模板bean

abstract=”true”表示这个bean,不能被实例化,而只能被继承使用

<bean id="parent" class="com.ncu.zte.Person" abstract="true">
	<property name="id" value="100" />
	<property name="name" value="我是父亲" />
	<property name="list">
		<list>
			<value>list1</value>s
			<value>list2</value>
			<value>list3</value>
		</list>
	</property>
</bean>

IOC之组件创建顺序

实验20:bean之间的依赖 depends-on 属性

bean对象

public class A {
	public A() {
		System.out.println("A 被创建了");
	}
}
public class B {
	public B() {
		System.out.println("B 被创建了");
	}
}
public class C {
	public C() {
		System.out.println("C 被创建了");
	}
}

applicationContext.xml配置:

<!-- 默认情况下。bean对象创建的顺序,是从上到下
		depends-on 可以设定依赖
 -->

<bean id="a" class="com.ncu.zte.A" depends-on="b,c"></bean>
<bean id="b" class="com.ncu.zte.B"></bean>
<bean id="c" class="com.ncu.zte.C"></bean>

基于xml配置文件的自动注入

先创建Person类和Car类

public class Car {
	private String carNo;
	private String name;

public class Person {

	private Car car;

	public Person(Car car) {
		this.car = car;
	}

applicationContext.xml配置文件:

<!-- 
		autowire 属性设置是否自动查找bean对象并给子对象赋值
		
		default 和 no 表示不自动查找并注入(你不赋值,它就null)
		byName 	是指通过属性名做为id来查找bean对象,并注入
					1、找到就注入
					2、找不到就为null
		byType  是指按属性的类型进行查找并注入
					1、找到一个就注入
					2、找到多个就报错
					3、没有找到就为null
		constructor 是指按构造器参数进行查找并注入。
					1、先按照构造器参数类型进行查找并注入
					2、如果按类型查找到多个,接着按参数名做为id继续查找并注入。
					3、按id查找不到,就不赋值。
	 -->

<bean id="p20" class="com.ncu.zte.Person" autowire="constructor">
<property name="name" value="p20"></property>

</bean>

IOC之Bean的单例和多例(重点)

实验21:测试bean的作用域,分别创建单实例和多实例的bean★

applicationContext.xml配置文件:

<!-- 
		scope 属性设置对象的域
			singleton			表示单例(默认)
								1、Spring容器在创建的时候,就会创建Bean对象
								2、每次调用getBean都返回spring容器中的唯一一个对象
								
			prototype			表示多例
								1、多例在Spring容器被创建的时候,不会跟着一起被创建。
								2、每次调用getBean都会创建一个新对象返回
								
			request				在一次请求中,多次调用getBean方法都是返回同一个实例。
			
								getBean("p20"); 底层大概的实现原理
									
								Object bean = request.getAttribute("p20");
								if (bean == null) {
									bean = new 对象();
									request.setAttribute("p20",bean);
								}
								return bean;
								
								
			session				在一个会话中,多次调用getBean方法都是返回同一个实例。
			
								getBean("p20"); 底层大概的实现原理
									
								Object bean = session.getAttribute("p20");
								if (bean == null) {
									bean = new 对象();
									session.setAttribute("p20",bean);
								}
								return bean;
	 -->