Spring實例化bean的四種方式詳解
一、bean實例化——構(gòu)造方法(常用)
bean本質(zhì)上就是對象,創(chuàng)建bean使用構(gòu)造方法完成
BookDao接口:
public interface BookDao {
public void save();
}
BookDaoImpl實現(xiàn)類,利用構(gòu)造方式提供可訪問的構(gòu)造方法,輸出相應字符串:
import com.itheima.dao.BookDao;
public class BookDaoImpl implements BookDao {
public BookDaoImpl() {
System.out.println("book dao constructor is running ....");
}
public void save() {
System.out.println("book dao save ...");
}
}AppForinstanceBook:
import com.itheima.dao.BookDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AppForInstanceBook {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
}
}applictionContext.xml配置:
<!--方式一:構(gòu)造方法實例化bean-->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>執(zhí)行結(jié)果:

無參構(gòu)造方法如果不存在,將拋出異常BeanCreationException
二、bean實例化——靜態(tài)工廠(了解)
OrderDao接口:
public interface OrderDao {
public void save();
}
OrderDaoImpl實現(xiàn)類:
import com.itheima.dao.OrderDao;
public class OrderDaoImpl implements OrderDao {
public void save() {
System.out.println("order dao save ...");
}
}OrderDaoFactory靜態(tài)工廠創(chuàng)建對象:
import com.itheima.dao.OrderDao;
import com.itheima.dao.impl.OrderDaoImpl;
//靜態(tài)工廠創(chuàng)建對象
public class OrderDaoFactory {
public static OrderDao getOrderDao(){
System.out.println("factory setup....");
return new OrderDaoImpl();
}
}AppForinstanceOrder:
import com.itheima.dao.OrderDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AppForInstanceOrder {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
OrderDao orderDao = (OrderDao) ctx.getBean("orderDao");
orderDao.save();
}
}applictionContext.xml配置:
<!--方式二:使用靜態(tài)工廠實例化bean-->
<bean id="orderDao" class="com.itheima.factory.OrderDaoFactory" factory-method="getOrderDao"/>執(zhí)行結(jié)果:

這種方式是為了兼容早期的遺留系統(tǒng)使用,了解即可。
三、bean實例化——實例工廠(了解)
UserDao接口:
public interface UserDao {
public void save();
}UserDaoImpl實現(xiàn)類:
import com.itheima.dao.UserDao;
public class UserDaoImpl implements UserDao {
public void save() {
System.out.println("user dao save ...");
}
}UserDaoFactory實例工廠創(chuàng)建對象:
import com.itheima.dao.UserDao;
import com.itheima.dao.impl.UserDaoImpl;
//實例工廠創(chuàng)建對象
public class UserDaoFactory {
public UserDao getUserDao(){
return new UserDaoImpl();
}
}AppForInstanceUser:
import com.itheima.dao.UserDao;
import com.itheima.factory.UserDaoFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AppForInstanceUser {
public static void main(String[] args) {
//創(chuàng)建實例工廠對象
UserDaoFactory userDaoFactory = new UserDaoFactory();
//通過實例工廠對象創(chuàng)建對象
UserDao userDao = userDaoFactory.getUserDao();
userDao.save();
}
}因為不是靜態(tài)方法,必須用工廠對象對象調(diào)用。
也可用Spring方法,不過要在xml文件中進行修改。
AppForInstanceUser:
import com.itheima.dao.UserDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AppForInstanceUser {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) ctx.getBean("userDao");
userDao.save();
}
}applictionContext.xml配置:
userFactory配合使用的,實際無意義
factory-method方法名不固定,每次都需要配置
<!--方式三:使用實例工廠實例化bean-->
<bean id="userFactory" class="com.itheima.factory.UserDaoFactory"/>
<bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>執(zhí)行結(jié)果:

四、bean實例化——FactoryBean(實用)
UserDao接口和UserDaoImpl實現(xiàn)類和實例化三一樣。
UserDaoFactoryBean,代替了原始實例化工廠中創(chuàng)建對象的方法:
import com.itheima.dao.UserDao;
import com.itheima.dao.impl.UserDaoImpl;
import org.springframework.beans.factory.FactoryBean;
//FactoryBean創(chuàng)建對象
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
//代替原始實例工廠中創(chuàng)建對象的方法
public UserDao getObject() throws Exception {
return new UserDaoImpl();
}
public Class<?> getObjectType() {
return UserDao.class;
}
}AppForInstanceUser:
import com.itheima.dao.UserDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AppForInstanceUser {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) ctx.getBean("userDao");
userDao.save();
}
}applictionContext.xml配置:
<!--方式四:使用FactoryBean實例化bean-->
<bean id="userDao" class="com.itheima.factory.UserDaoFactoryBean"/>執(zhí)行結(jié)果:

對象默認單例,需要改非單例時
在UserDaoFactoryBean重寫isSingleton方法,true為單例模式,false為非單例模式
通常為單例,這個方法通常不寫
public boolean isSingleton() {
return true;
}到此這篇關(guān)于Spring實例化bean的四種方式詳解的文章就介紹到這了,更多相關(guān)Spring實例化bean內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring boot如何配置請求的入?yún)⒑统鰠son數(shù)據(jù)格式
這篇文章主要介紹了spring boot如何配置請求的入?yún)⒑统鰠son數(shù)據(jù)格式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-11-11
springboot @ConfigurationProperties和@PropertySource的區(qū)別
這篇文章主要介紹了springboot @ConfigurationProperties和@PropertySource的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
Spring Cloud 配置中心內(nèi)容加密的配置方法
這篇文章主要介紹了Spring Cloud 配置中心內(nèi)容加密的配置方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-06-06

