在一步一步深入spring(1)--搭建和测试spring的开发环境中提到了一种实例化bean的方式,也是最基本的使用构造器实例化bean
1.使用构造器实例化bean:这是最简单的方式,Spring IoC容器即能使用默认空构造器
2.使用静态工厂方式实例化Bean,使用这种方式除了指定必须的class属性,还要指定factory-method属性来指定实例化Bean的方法,而且使用静态工厂方法也允许指定方法参数,spring IoC容器将调用此属性指定的方法来获取Bean,配置如下所示:
(1)先编写一个静态工厂类方法:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 package junit.test; 2 3 import com.yangyang.PersonService; 4 import com.yangyang.impl.PersonServiceImpl; 5 6 public class PersonServiceBeanFactory { 7 //工厂方法 8 public static PersonService newInstance(){ 9 //返回需要的实例 10 return new PersonServiceImpl(); 11 } 12 13 }
(2)编写配置文件
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 3 "http://www.springframework.org/dtd/spring-beans.dtd"> 4 5 <beans> 6 <!-- id 表示你这个组件的名字,class表示组件类 --> 7 <!-- <bean id="personService" class="com.yangyang.impl.PersonServiceImpl"></bean> --> 8 <!-- 通过使用静态工厂方式实例化Bean --> 9 <bean id="personService2" class="junit.test.PersonServiceBeanFactory" factory-method="newInstance"></bean> 10 </beans>
(3)编写单元测试
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 ApplicationContext ctx=new ClassPathXmlApplicationContext("resources/beans.xml"); 2 //从容器中获取Bean,注意此处完全“面向接口编程,而不是面向实现” 3 //通过使用静态工厂方式实例化Bean 4 PersonService personService2=(PersonService) ctx.getBean("personService2",PersonService.class); 5 personService2.sayHello();
也能像方法一的一样出现hello world字样,实例化bean成功
3.使用实例工厂方法实例化Bean:使用这种方式不能指定class属性,此时必须使用factory-bean属性来指定工厂Bean,factory-method属性指定实例化Bean的方法,而且使用实例工厂方法允许指定方法参数,方式和使用构造器方式一样,配置如下:
(1)先编写实例工厂类:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 package junit.test; 2 3 import com.yangyang.PersonService; 4 import com.yangyang.impl.PersonServiceImpl; 5 6 public class PersonServiceBeanFactory { 7 //实例化工厂方法 8 public PersonService newInstance(){ 9 return new PersonServiceImpl(); 10 } 11 12 }
(2)编写配置文件
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 3 "http://www.springframework.org/dtd/spring-beans.dtd"> 4 5 <beans> 6 <!-- id 表示你这个组件的名字,class表示组件类 --> 7 <!--1、定义实例工厂Bean --> 8 <bean id="beanInstanceFactory" class="junit.test.PersonServiceBeanFactory"/> 9 <!-- 2、使用实例工厂Bean创建Bean --> 10 <bean id="personService3" factory-bean="beanInstanceFactory" factory-method="newInstance"></bean> 11 </beans>
(3)编写单元测试:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 //读取配置文件实例化一个IoC容器 2 ApplicationContext ctx=new ClassPathXmlApplicationContext("resources/beans.xml"); 3 //通过实例工厂类实例化Bean 4 PersonService personService2=(PersonService) ctx.getBean("personService3",PersonService.class); 5 personService2.sayHello();
也能像方法一的一样出现hello world字样,实例化bean成功