我看了這篇博文《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();
}
}
總結:提倡使用無參構造實例化。
非靜態