spring實例化bean三種方式

我看了這篇博文《https://www.cnblogs.com/zhanglei93/p/6221546.html》,以及本身實踐總結了關於spring實例化bean對象的3種方式。html

1、經過構造java

  1.1經過無參構造:spring

    在加載applicationContext.xml文件的時候會經過無參構造實例化對象。app

  applicationContext.xml測試

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


<!-- 配置service -->

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

</beans>

   須要被spring管理的類spa

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經過有參構造:code

 在加載applicationContext.xml文件的時候會經過有參構造實例化對象。xml

applicationContext.xmlhtm

此處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);
	}
}

 2、經過靜態工廠

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();
	}
}

 

3、經過實例(非靜態)工廠

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();
	}
}

 

總結:提倡使用無參構造實例化。

 

非靜態

相關文章
相關標籤/搜索