Bean实例化的三种方式
说明:通过配置文件创建对象就称为Bean实例化。
第一种:使用类的无参构造创建(重点)
实体类
1 package com.tyzr.ioc; 2 public class User { 3 private String username; 4 public User(String username) { 5 super(); 6 this.username = username; 7 } 8 public User() { 9 } 10 public void add(){ 11 System.out.println("--------->add"); 12 } 13 public static void main(String[] args) { 14 //原始做法 15 //User user = new User(); 16 //user.add(); 17 } 18 }
配置文件
1 <!-- IOC入门 --> 2 <bean id="user" class="com.tyzr.ioc.User"></bean>
测试类
1 @Test 2 public void testUser(){ 3 //加载核心配置文件,创建对象 4 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 5 //得到我们配置的对象 6 //<bean id="user" class="com.tyzr.ioc.User"></bean> 7 User user = (User)context.getBean("user"); 8 user.add(); 9 }
问题:如果类里面没有无参构造方法会出现异常,如下:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'user' defined in class path resource [applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.tyzr.ioc.User]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.tyzr.ioc.User.<init>(
第二种:使用静态工厂创建
创建静态的方法,返回类的对象。
实体类
1 package com.tyzr.bean; 2 public class Bean2 { 3 public void bean2(){ 4 System.out.println("bean2------------"); 5 } 6
1 package com.tyzr.bean; 2 public class Bean2Factory { 3 //静态方法返回bean2 4 public static Bean2 getBean2(){ 5 return new Bean2(); 6 } 7 }
配置文件
1 <!-- 使用静态工厂创建对象 --> 2 <bean id="bean2" class="com.tyzr.bean.Bean2Factory" factory-method="getBean2"></bean>
测试类
1 @Test 2 public void testBean2(){ 3 //加载核心配置文件,创建对象 4 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 5 //得到我们配置的对象 6 //<bean id="bean2" class="com.tyzr.bean.Bean2Factory" factory-method="getBean2"></bean> 7 Bean2 bean2 = (Bean2)context.getBean("bean2"); 8 bean2.bean2(); 9 }
第三种:使用实例工厂创建
创建不是静态的方法,返回类的对象。
实体类
1 package com.tyzr.bean; 2 public class Bean3 { 3 public void bean3(){ 4 System.out.println("bean3------------"); 5 } 6 }
1 public class Bean3Factory { 2 //普通方法返回bean3 3 public Bean3 getBean3(){ 4 return new Bean3(); 5 } 6 }
配置文件
1 <!-- 实例工厂创建对象 --> 2 <!-- 因为工厂里面的方法不是静态的,所以工厂本身也得创建对象 --> 3 <bean id="bean3Factory" class="com.tyzr.bean.Bean3Factory"></bean> 4 <bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>
测试类
1 @Test 2 public void testBean3(){ 3 //加载核心配置文件,创建对象 4 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 5 //得到我们配置的对象 6 //<!-- 实例工厂创建对象 --> 7 //<!-- 因为工厂里面的方法不是静态的,所以工厂本身也得创建对象 --> 8 //<bean id="bean3Factory" class="com.tyzr.bean.Bean3Factory"></bean> 9 //<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean> 10 Bean3 bean3 = (Bean3)context.getBean("bean3"); 11 bean3.bean3(); 12 }