【Spring】的【bean】管理(XML配置文件)【Bean实例化的三种方式】

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     }

 

posted @ 2017-08-17 19:05  Angelye  阅读(347)  评论(0编辑  收藏  举报