Spring:IOC容器创建Bean的方式有哪几种?
三种:直接使用构造器、从静态工厂中拿、从实例工厂中拿。
一、直接使用构造器
1、配置bean
<bean class="com.lurenjia.dao.DemoDao" id="demoDao"></bean>
2、从容器中获取
//获取到ioc容器对象 ApplicationContext applicationContext = new ClassPathXmlApplicationContext( "applicationContext.xml"); //获取到bean对象 DemoDao demoDao = applicationContext.getBean("demoDao",DemoDao.class);
二、从静态工厂中拿
静态工厂:生产对象的方法为静态方法。
1、配置bean
<!--通过静态工厂获取一个demo对象--> <bean id="demoDao2" class="com.lurenjia.factory.DemoFactory" factory-method="getObject"></bean>
2、从容器中获取
//获取到ioc容器对象 ApplicationContext applicationContext = new ClassPathXmlApplicationContext( "applicationContext.xml"); //获取到bean对象 DemoDao demoDao = applicationContext.getBean("demoDao2",DemoDao.class);
三、从实例工厂中拿
实例工厂,生产对象的方法不为静态方法,即必须通过工厂的实例对象调用。
1、配置bean
<!--配置工厂对象--> <bean id="factory" class="com.lurenjia.factory.DemoFactory"></bean> <!--配置要拿的对象--> <bean id="demoDao" factory-bean="factory" factory-method="getObject"></bean>
2、从容器中获取
//获取到ioc容器对象 ApplicationContext applicationContext = new ClassPathXmlApplicationContext( "applicationContext.xml"); //获取到bean对象 DemoDao demoDao = applicationContext.getBean("demoDao",DemoDao.class);
针对实例工厂的配置繁琐,spring提供了一个FactoryBean接口,实例工厂类只要实现了这个接口就能够简化配置。
四、实例工厂实现FactoryBean接口
1、实现接口,重写方法
//泛型内为要创建的对象类型 public class DemoFactory implements FactoryBean<DemoDao> { //创建对象的方法 public DemoDao getObject(){ return new DemoDao(); } //拿到对象类型的方法 @Override public Class<?> getObjectType() { return null; } //是否为单例对象,可不重写此方法,默认为true @Override public boolean isSingleton() { return true; } }
问题:如果我在实例工厂声明了我造的对象为原型对象,而在配置文件中配置为单例(scope="singleton"),那会如何?
答案:会造出原型对象,非单例。
2、配置bean
<bean id="demoDao" class="com.lurenjia.factory.DemoFactory"></bean>
3、从容器中获取对象
//获取到ioc容器对象 ApplicationContext applicationContext = new ClassPathXmlApplicationContext( "applicationContext.xml"); //获取到bean对象 DemoDao demoDao = applicationContext.getBean("demoDao",DemoDao.class);