前言
為了鞏固所學(xué)的知識(shí),作者嘗試著開始發(fā)布一些學(xué)習(xí)筆記類的博客,方便日后回顧。當(dāng)然,如果能幫到一些萌新進(jìn)行新技術(shù)的學(xué)習(xí)那也是極好的。作者菜菜一枚,文章中如果有記錄錯(cuò)誤,歡迎讀者朋友們批評(píng)指正。
(博客的參考源碼以及可以在我主頁(yè)的資源里找到,如果在學(xué)習(xí)的過(guò)程中有什么疑問(wèn)歡迎大家在評(píng)論區(qū)向我提出)
發(fā)現(xiàn)寶藏
前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家?!緦毑厝肟凇?。
1.Bean實(shí)例化簡(jiǎn)介
- 面向?qū)ο蟮某绦蛑?,想要使用某個(gè)對(duì)象,就需要先實(shí)例化對(duì)象。同樣,在Spring中,要想使用容器中的Bean,也需要實(shí)例化Bean。
- 實(shí)例化Bean的方式有三種,分別是構(gòu)造器實(shí)例化、靜態(tài)工廠實(shí)例化和實(shí)例工廠實(shí)例化(其中最常用的是構(gòu)造器實(shí)例化)。接下來(lái)演示一下三種實(shí)例化方法
2.bean的實(shí)例化 – 構(gòu)造方法
1. 創(chuàng)建新的maven模塊respr_newbean,并在pom.xml添加spring的坐標(biāo)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.22</version>
<scope>compile</scope>
</dependency>
2. 創(chuàng)建核心配置文件applicationContext.xml文件、dao接口及其實(shí)現(xiàn)類以及相關(guān)的類(先寫標(biāo)記部分)
3. 編寫dao接口及其實(shí)現(xiàn)類
- BookDao接口
public interface BookDao {
public void save();
}
- BookDaoImpl實(shí)現(xiàn)類
public class BookDaoImpl implements BookDao {
//無(wú)參構(gòu)造
public BookDaoImpl() {
System.out.println("book dao constructor is running ....");
}
public void save() {
System.out.println("book dao save ...");
}
}
- 進(jìn)行測(cè)試的類 AppForInstanceBook
public class AppForInstanceBook {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
}
}
- applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--方式一:構(gòu)造方法實(shí)例化bean-->
<bean id="bookDao" class="org.example.dao.impl.BookDaoImpl"/>
</beans>
- AppForInstanceBook運(yùn)行結(jié)果
- 結(jié)論
spring構(gòu)造方法實(shí)例化bean使用了無(wú)參構(gòu)造器,可以省略無(wú)參構(gòu)造器的書寫。實(shí)例化bean就是用構(gòu)造方法來(lái)實(shí)例化對(duì)象。
3.bean的實(shí)例化 – 靜態(tài)工廠實(shí)例化
1. 創(chuàng)建dao接口及其實(shí)現(xiàn)類以及相關(guān)的類(先寫標(biāo)記部分)
2. 編寫dao接口及其實(shí)現(xiàn)類以及相關(guān)的類
- OrderDao接口
package org.example.dao;
public interface OrderDao {
public void save();
}
- OrderDaoImpl實(shí)現(xiàn)類
在這里插入代碼片package org.example.dao.impl;
import org.example.dao.OrderDao;
public class OrderDaoImpl implements OrderDao {
public void save() {
System.out.println("order dao save ...");
}
}
- 工廠類OrderDaoFactory(靜態(tài)工廠類代理生成對(duì)象)
package org.example.factory;
import org.example.dao.OrderDao;
import org.example.dao.impl.OrderDaoImpl;
//靜態(tài)工廠創(chuàng)建對(duì)象
public class OrderDaoFactory {
public static OrderDao getOrderDao(){
System.out.println("factory setup....");
return new OrderDaoImpl();
}
}
- AppForInstanceOrder模擬測(cè)試類編寫(純JAVA開發(fā),此處還沒(méi)有Spring)
public class AppForInstanceOrder {
public static void main(String[] args) {
//通過(guò)靜態(tài)工廠創(chuàng)建對(duì)象
OrderDao orderDao = OrderDaoFactory.getOrderDao();
orderDao.save();
}
}
- 模擬測(cè)試類的運(yùn)行結(jié)果
- 簡(jiǎn)要分析
將 OrderDaoImpl 創(chuàng)建對(duì)象的 工作交給 靜態(tài)工廠 OrderDaoFactory 類來(lái)完成,如果用spring代理這種工廠模式的開發(fā),寫法如下
- spring 代理靜態(tài)工廠實(shí)例化對(duì)象
public class AppForInstanceOrder {
public static void main(String[] args) {
//通過(guò)靜態(tài)工廠創(chuàng)建對(duì)象
// OrderDao orderDao = OrderDaoFactory.getOrderDao();
// orderDao.save();
// spring代理靜態(tài)工廠實(shí)例化對(duì)象
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
OrderDao orderDao = (OrderDao) ctx.getBean("orderDao");
orderDao.save();
}
}
- applicationContext.xml文件配置靜態(tài)工廠 OrderDaoFactory bean (注意factory-method屬性)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--方式一:構(gòu)造方法實(shí)例化bean-->
<!-- <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>-->
<!-- 方式二:使用靜態(tài)工廠實(shí)例化bean-->
<bean id="orderDao" class="com.itheima.factory.OrderDaoFactory" factory-method="getOrderDao"/>
</beans>
- 運(yùn)行結(jié)果
4.bean實(shí)例化 – 實(shí)例工廠和FactoryBean
1. 創(chuàng)建dao接口及其實(shí)現(xiàn)類以及相關(guān)的類(標(biāo)記部分)
2. 編寫dao接口及其實(shí)現(xiàn)類以及相關(guān)的類
- UserDao接口
public interface UserDao {
public void save();
}
- UserDaoImpl實(shí)現(xiàn)類
public class UserDaoImpl implements UserDao {
public void save() {
System.out.println("user dao save ...");
}
}
- UserDaoFactoryBean實(shí)例工廠類
//實(shí)例工廠創(chuàng)建對(duì)象
public class UserDaoFactory {
public UserDao getUserDao(){
return new UserDaoImpl();
}
}
- AppForInstanceUser模擬測(cè)試類(純JAVA開發(fā))
public class AppForInstanceUser {
public static void main(String[] args) {
// //創(chuàng)建實(shí)例工廠對(duì)象
UserDaoFactory userDaoFactory = new UserDaoFactory();
// //通過(guò)實(shí)例工廠對(duì)象創(chuàng)建對(duì)象
UserDao userDao = userDaoFactory.getUserDao();
userDao.save();
}
}
3. 運(yùn)行結(jié)果
4. 簡(jiǎn)要分析
此時(shí)與靜態(tài)工廠的區(qū)別是模擬測(cè)試類中多了創(chuàng)建工廠對(duì)象的步驟
- spring代理下的實(shí)例工廠bean實(shí)例化模擬測(cè)試類
public class AppForInstanceUser {
public static void main(String[] args) {
// //創(chuàng)建實(shí)例工廠對(duì)象
// UserDaoFactory userDaoFactory = new UserDaoFactory();
// //通過(guò)實(shí)例工廠對(duì)象創(chuàng)建對(duì)象
// UserDao userDao = userDaoFactory.getUserDao();
// userDao.save();
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) ctx.getBean("userDao");
userDao.save();
}
}
5. applicationContext.xml(分辨方式二和方式三的寫法)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--方式一:構(gòu)造方法實(shí)例化bean-->
<!-- <bean id="bookDao" class="org.example.dao.impl.BookDaoImpl"/>-->
<!-- 方式二:使用靜態(tài)工廠實(shí)例化bean-->
<!-- <bean id="orderDao" class="org.example.factory.OrderDaoFactory" factory-method="getOrderDao"/>-->
<!--方式三:使用實(shí)例工廠實(shí)例化bean-->
<bean id="userFactory" class="org.example.factory.UserDaoFactory"/>
<bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>
</beans>
6. 模擬測(cè)試類運(yùn)行結(jié)果
7. spring代理實(shí)例工廠bean實(shí)例化簡(jiǎn)要分析 --> 改進(jìn)為BeanFactory bean實(shí)例化
8. 創(chuàng)建并編寫B(tài)eanFactory工廠類UserDaoFactoryBean
//FactoryBean創(chuàng)建對(duì)象
//實(shí)現(xiàn)接口,創(chuàng)建什么對(duì)象寫什么泛型
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
//實(shí)現(xiàn)抽象方法
//代替原始實(shí)例工廠中創(chuàng)建對(duì)象的方法,以后方法名不用指定,就用getObject
public UserDao getObject() throws Exception {
return new UserDaoImpl();
}
//配置的類是什么類型
public Class<?> getObjectType() {
return UserDao.class;
}
}
9. 配置applicationContext.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--方式一:構(gòu)造方法實(shí)例化bean-->
<!-- <bean id="bookDao" class="org.example.dao.impl.BookDaoImpl"/>-->
<!-- 方式二:使用靜態(tài)工廠實(shí)例化bean-->
<!-- <bean id="orderDao" class="org.example.factory.OrderDaoFactory" factory-method="getOrderDao"/>-->
<!--方式三:使用實(shí)例工廠實(shí)例化bean-->
<!-- <bean id="userFactory" class="org.example.factory.UserDaoFactory"/>-->
<!-- <bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>-->
<!--方式四:使用FactoryBean實(shí)例化bean-->
<bean id="userDao" class="org.example.factory.UserDaoFactoryBean"/>
</beans>
10. 模擬測(cè)試類運(yùn)行結(jié)果
5.三種bean實(shí)例化方式的區(qū)別
1. 構(gòu)造器實(shí)例化
通過(guò)無(wú)參構(gòu)造的方法實(shí)例化Bean,其實(shí)質(zhì)是將Bean對(duì)應(yīng)的類交給Spring自帶的工廠(BeanFactory)管理,由Spring自帶的工廠模式幫我們創(chuàng)建和維護(hù)這個(gè)類
2. 靜態(tài)工廠方式實(shí)例化
- 通過(guò)靜態(tài)工廠創(chuàng)建并返回Bean。其實(shí)質(zhì)是將Bean對(duì)應(yīng)的類交給我們自己的靜態(tài)工廠管理。Spring只是幫我們調(diào)用了靜態(tài)工廠創(chuàng)建實(shí)例的方法。
- 運(yùn)用:很多時(shí)候我們?cè)谑褂玫谌絡(luò)ar包提供給我們的類時(shí),由于這個(gè)類沒(méi)有構(gòu)造方法,是通過(guò)第三方包提供的靜態(tài)工廠創(chuàng)建的,如果我們想把第三方j(luò)ar包里面的這個(gè)類交由Spring來(lái)管理的話,就可以使用Spring提供的靜態(tài)工廠創(chuàng)建實(shí)例的配置。
3. 實(shí)例工廠方式實(shí)例化文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-599259.html
- 通過(guò)實(shí)例工廠創(chuàng)建并返回Bean,其實(shí)質(zhì)就是把創(chuàng)建實(shí)例的工廠類和調(diào)用工廠類的方法創(chuàng)建實(shí)例的方法的過(guò)程也交由Spring管理,創(chuàng)建實(shí)例的這個(gè)過(guò)程也是由我們自己配置的實(shí)例工廠內(nèi)部實(shí)現(xiàn)的。
- 運(yùn)用:如Spring整合Hibernate就是通過(guò)這種方式實(shí)現(xiàn)的。但對(duì)于沒(méi)有與Spring整合過(guò)的工廠類,我們一般都是自己用代碼來(lái)管理的。
4. 小結(jié)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-599259.html
- 三種方法最常用的就是構(gòu)造器實(shí)例化,
- 靜態(tài)工廠類與非靜態(tài)工廠類的區(qū)別是,前者不需要?jiǎng)?chuàng)建對(duì)象,直接可以調(diào)用靜態(tài)方法創(chuàng)建bean;后者則要先創(chuàng)建對(duì)象,然后再通過(guò)對(duì)象調(diào)用其方法創(chuàng)建bean
總結(jié)
到了這里,關(guān)于spring中bean實(shí)例化的三種方式 -- Spring入門(二)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!