SpringIOC创建bean对象的三种方式
通常有3种方式,第一种用于我们自定义的类,后面两种是为了应用第三方jar包中的类,根据jar中的创建对象的方式进行选择
创建bean的类型
<!-- scope: 设置bean对象的作用范围 singleton: 单实例对象 默认 prototype: 多实例对象 -->
<bean scope="prototype" id="AccountService4" class="com.village.service.impl.AccountServiceImpl"></bean>
测试类
public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); for (int i = 0; i < 10; i++) { AccountService service = ac.getBean("AccountService4", AccountService.class); System.out.println(service); } }
第一种:通过默认构造函数创建
此种方式通常用于我们自己写的类,在spring中配置。 <!-- IOC容器创建Bean对象的多种方式 方式1: 无参构造创建Bean对象 bean标签: 声明需要创建类对象 id: 唯一标识,获取此类对象时,需要根据id获取 class: 被创建的类的全限定名 --> <bean id="AccountService" class="com.village.service.impl.AccountServiceImpl"></bean>
第二种:通过工厂对象的方法来创建(静态)
class属性: 指定的是工厂的全限定类名 factory-method属性:指定的是工厂中用于创建对象的静态方法 <!-- 方式2: 使用工厂的静态方法创建类对象 //1.创建工厂对象 //2.在工厂对象中提供一个创建对象的静态方法 //3.在配置文件中配置 id: 存放到IOC容器的唯一标识 class: 静态工厂的全限定名 factory-method: 调用指定工厂中的静态方法来创建对象 new UserServiceImpl() 当解析这行配置时,Spring会调用工厂的静态方法,将返回值对象存放到IOC容器 --> <bean id="AccountService2" class="com.village.factory.StaticFactory" factory-method="createBean"></bean> 此种方法通常用于不是我们自己写的类,而是存在于jar包中已经写好的类。(它都是.class文件),比如Mybatis中的sqlsessionFactory创建对像,不允许直接new对象
第三种:通过工厂对象的方法来创建(非静态)
factory-bean属性:指定的是工厂bean的id. factory-method属性:指定的是工厂中用于创建对象的非静态方法 <!-- 方式3: 使用工厂的非静态方法创建类对象 //1.创建工厂对象 //2.在工厂对象中提供一个创建对象的非静态方法 //3.在配置文件中配置 先创建工厂对象,并将工厂对象存放到IOC容器中 再调用工厂对象中的非静态方法创建类对象,并将类对象存放到IOC容器中 --> <!--先创建工厂对象,并将工厂对象存放到IOC容器中--> <bean id="InstanceFactory" class="com.village.factory.InstanceFactory"></bean> <!--调用工厂对象中的非静态方法创建类对象,并将类对象存放到IOC容器中--> <bean id="AccountService3" factory-bean="InstanceFactory" factory-method="createBean"></bean> 此种方式通常用于不是我们自己写的类。
完整测试类
package com.village.web; import com.itheima.service.AccountService; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class CreateBeanClient { public static void main(String[] args) { // 方式1: 调用类的无参构造创建对象 //demo1(); // 方式2: 调用工厂的静态方法创建bean对象 //demo2(); // 方式3: 调用工厂的非静态方法创建bean对象 demo3(); } private static void demo3() { ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); AccountService service = ac.getBean("AccountService3", AccountService.class); service.save(); } private static void demo2() { ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); AccountService service = ac.getBean("AccountService2", AccountService.class); service.save(); } private static void demo1() { ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); AccountService service = ac.getBean("AccountService", AccountService.class); service.save(); } }
package com.village.factory; import com.itheima.service.impl.AccountServiceImpl; public class StaticFactory { /** * 将此方法配置到Spring的配置文件中 * Spring框架会调用此方法,将返回的对象存放到IOC容器中 * @return */ public static Object createBean(){ return new AccountServiceImpl(); } }
package com.village.factory; import com.itheima.service.impl.AccountServiceImpl; public class InstanceFactory { /** * 将此方法配置到Spring的配置文件中 * Spring调用此方法,将方法的返回值存放到IOC容器中 * @return */ public Object createBean(){ return new AccountServiceImpl(); } }