HappyComponent.java
java
package com.atguigu.Ioc_01;
public class HappyComponent {
// 默认包含无参的构造方法
public void dowork(){
System.out.println("HappyComponent.dowork");
}
}
ClientService.java
java
package com.atguigu.Ioc_01;
静态工厂类
public class ClientService {
private static ClientService clientService = new ClientService();
private ClientService() {
}
public static ClientService clientService() {
return clientService;
}
}
ClientServiceImpl.java
java
package com.atguigu.Ioc_01;
public class ClientServiceImpl {
}
DefaultServiceLocator.java
java
package com.atguigu.Ioc_01;
非静态工厂类
public class DefaultServiceLocator {
public static ClientServiceImpl clientService = new ClientServiceImpl();
public ClientServiceImpl createClientServiceInstance() {
return clientService;
}
}
resources目录下的 .xml文件
xml
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
1、可以使用无参构造函数实例化的组件,如何进行Ioc配置呢?
<bean - 一个组件信息(一个组件对象)
id:组件的标识,唯一
class:组件的类的权限定符
配置了两个组件happyComponent1 和 happyComponent2,
它们的类型都是com.atguigu.Ioc_01.HappyComponent,
Spring容器会使用无参构造函数来创建这两个组件的实例,并将它们存储在IoC容器中,
因为,默认是单例模式(singleton),即使声明了两次,
Spring容器也只会创建一个HappyComponent的实例,
但会为这两个bean引用提供相同的实例。
当你从容器中获取这两个bean的引用时:
HappyComponent happyComponent1 = context.getBean("happyComponent1", HappyComponent.class);
HappyComponent happyComponent2 = context.getBean("happyComponent2", HappyComponent.class);
happyComponent1、happyComponent2这两个引用实际上是指向同一个HappyComponent对象的,即它们的地址(内存中的引用)是相同的,
这就是单例作用域的含义。
<bean id="happyComponent1" class="com.atguigu.Ioc_01.HappyComponent" />
<bean id="happyComponent2" class="com.atguigu.Ioc_01.HappyComponent" />
2、静态工厂类,如何声明工厂方法进行Ioc配置?
id = "组件的标识"
class ="工厂类的权限定符"
factory-method = "静态工厂方法"
下面这个bean,意思是:
调用"com.atguigu.Ioc_01.ClientService"这个工厂类的"clientService"方法,
将它造出的组件对象,存储到Ioc容器,叫clientService(id等于的那个值)
配置了一个名为clientService的组件,它并不直接通过类的构造函数来实例化,
而是,通过调用com.atguigu.Ioc_01.ClientService类的静态方法clientService来创建实例,
factory-method属性用于指定用于创建组件实例的静态工厂方法。
<bean id="clientService" class="com.atguigu.Ioc_01.ClientService" factory-method="clientService" />
3、非静态工厂,如何声明Ioc配置?
配置了一个非静态工厂defaultServiceLocator,它本身也是一个bean,由Spring容器管理,
然后,通过factory-bean属性指定了非静态工厂bean的id,
并且,通过factory-method属性指定了用于创建组件实例的非静态工厂方法createClientServiceInstance,
所以,Spring容器会首先创建defaultServiceLocator的实例,然后调用其createClientServiceInstance方法来创建clientService2组件的实例
步骤1、配置工厂类的组件信息
<bean id="defaultServiceLocator" class="com.atguigu.Ioc_01.DefaultServiceLocator" />
步骤2、通过指定非静态工厂对象和方法名,来配置生成Ioc信息
也就是:根据工厂对象的实例工厂方法,进行实例化组件对象。
<bean id="clientService2" factory-bean="defaultServiceLocator" factory-method="createClientServiceInstance" />
</beans>