我看了这篇博文《https://www.cnblogs.com/zhanglei93/p/6221546.html》,以及自己实践总结了关于spring实例化bean对象的3种方式。

一、通过构造

  1.1通过无参构造:

    在加载applicationContext.xml文件的时候会通过无参构造实例化对象。

  applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans 
	<!--约束省略-->


<!-- 配置service -->

<bean id="userService" class="com.xx.service.UserServiceImpl" />

</beans>

   需要被spring管理的类

package com.xx.service;

public class UserServiceImpl implements UserService{

	public void run(){
		System.out.println("userService is running");
	}
	public UserServiceImpl(){
		System.out.println("no param");
	}
}

 

1.2通过有参构造:

 在加载applicationContext.xml文件的时候会通过有参构造实例化对象。

applicationContext.xml

此处index表示构造里的参数,从0开始,value是形参的值

<?xml version="1.0" encoding="UTF-8"?>
<beans 
    <!--约束省略-->
<!-- 配置service -->
<bean id="userService" class="com.xx.service.UserServiceImpl">
<constructor-arg index="0" value="rose"/>
<constructor-arg index="1" value="mark"/>
</bean>
</beans>

 需要被spring管理的类

rose和mark会被当做形式参数将值传递给str和str1,从而完成实例化对象

package com.xx.service;

public class UserServiceImpl implements UserService{
	public void run(){
		System.out.println("userService is running");
	}
	public UserServiceImpl(String str,String str1){
		System.out.println(str);
		System.out.println(str1);
	}
}

 二、通过静态工厂

applicationContext.xml文件

factory-method是class下的静态方法,意味着执行此方法从而得到实例化的对象

<?xml version="1.0" encoding="UTF-8"?>
<beans 
    《!--约束省略--》

<bean id="userServiceByFactory" class="com.xx.factory.BeanFactory" factory-method="createUserService"/>

</beans>

生产实例化工厂

package com.xx.factory;

import com.xx.service.UserService;
import com.xx.service.UserServiceImpl;

public class BeanFactory {
	
	public static UserService createUserService(){
		return new UserServiceImpl();
	}
}

 

三、通过实例(非静态)工厂

applicationContext.xml

指定哪个类,哪个方法,从而返回实例化对象

<?xml version="1.0" encoding="UTF-8"?>
<beans 
	<!--约束省略-->

<bean id="beanFactory" class="com.xx.factory.BeanFactory"/>
<bean id="userService" factory-bean="beanFactory" factory-method="createUserService"/>

</beans>

 

  实例工厂

package com.xx.factory;

import com.xx.service.UserService;
import com.xx.service.UserServiceImpl;

public class BeanFactory {
	
	public UserService createUserService(){
		return new UserServiceImpl();
	}
	
}

以上三种方式的测试方法:

package com.xx.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.xx.service.UserService;
public class UserServiceTest {
	private ApplicationContext context = null;
	@Test
	public void TestApp() {
		String beanPath="classpath:applicationContext.xml";
		context = new ClassPathXmlApplicationContext(beanPath);
		UserService userService = (UserService) context.getBean("userService");
		userService.run();
	}
}

 

总结:提倡使用无参构造实例化。

 

非静态