最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring 中使用反射創(chuàng)建 Bean 實(shí)例的幾種方式

 更新時(shí)間:2025年03月21日 11:00:18   作者:冰糖心書房  
文章介紹了在Spring框架中如何使用反射來創(chuàng)建Bean實(shí)例,包括使用Class.newInstance()、Constructor.newInstance()、工廠方法以及Spring的BeanUtils工具類,文章還強(qiáng)調(diào)了反射操作的注意事項(xiàng),如異常處理、性能、安全性以及類型安全,感興趣的朋友一起看看吧

在 Spring 中,雖然框架內(nèi)部大量使用了反射來創(chuàng)建 Bean 實(shí)例,但通常情況下,我們不需要直接使用反射來創(chuàng)建 Bean。Spring 容器會(huì)根據(jù) Bean 定義自動(dòng)完成 Bean 的創(chuàng)建和管理。

不過,了解如何使用反射創(chuàng)建 Bean 實(shí)例有助于我們更深入地理解 Spring 的工作原理,以及在某些特殊情況下(例如,自定義 FactoryBean、編寫測(cè)試代碼、動(dòng)態(tài)創(chuàng)建對(duì)象等)進(jìn)行更靈活的操作。

以下是使用反射創(chuàng)建 Bean 實(shí)例的幾種方式:

1. 使用 Class.newInstance() (僅限無參構(gòu)造函數(shù)):

這是最簡(jiǎn)單的方式,但只能用于具有 public 無參構(gòu)造函數(shù) 的類。已過時(shí) (Deprecated): 從 Java 9 開始,Class.newInstance() 方法已被標(biāo)記為過時(shí),推薦使用 getDeclaredConstructor().newInstance()。

public class MyBean {
    public MyBean() {
        System.out.println("MyBean created using default constructor.");
    }
}
public class CreateBeanWithReflection {
    public static void main(String[] args) throws Exception {
        // 使用 Class.newInstance() (已過時(shí))
        Class<MyBean> clazz = MyBean.class;
        MyBean myBean = clazz.newInstance(); // 創(chuàng)建 MyBean 實(shí)例
    }
}

2. 使用 Constructor.newInstance() (推薦):

  • 這是更靈活的方式,可以用于具有任何類型構(gòu)造函數(shù)(包括私有構(gòu)造函數(shù)、帶參數(shù)的構(gòu)造函數(shù))的類。
  • 需要先獲取 Constructor 對(duì)象,然后調(diào)用其 newInstance() 方法。
import java.lang.reflect.Constructor;
public class MyBean {
    private String name;
    private int age;
    // 無參構(gòu)造函數(shù)
    public MyBean() {
        System.out.println("MyBean created using default constructor.");
    }
    // 帶參數(shù)的構(gòu)造函數(shù)
    public MyBean(String name, int age) {
        System.out.println("MyBean created using parameterized constructor.");
        this.name = name;
        this.age = age;
    }
    // 私有構(gòu)造函數(shù)
    private MyBean(String name){
        System.out.println("MyBean created using private constructor");
        this.name = name;
    }
}
 public class CreateBeanWithReflection {
    public static void main(String[] args) throws Exception {
         Class<MyBean> clazz = MyBean.class;
        // 1. 使用無參構(gòu)造函數(shù)
        Constructor<MyBean> defaultConstructor = clazz.getDeclaredConstructor();
        MyBean myBean1 = defaultConstructor.newInstance();
        // 2. 使用帶參數(shù)的構(gòu)造函數(shù)
        Constructor<MyBean> parameterizedConstructor = clazz.getDeclaredConstructor(String.class, int.class);
        MyBean myBean2 = parameterizedConstructor.newInstance("John", 30);
        // 3. 使用私有構(gòu)造函數(shù)
        Constructor<MyBean> privateConstructor = clazz.getDeclaredConstructor(String.class);
        privateConstructor.setAccessible(true); // 設(shè)置可訪問私有構(gòu)造函數(shù)
        MyBean myBean3 = privateConstructor.newInstance("Private Bean");
    }
}

3. 使用工廠方法 (Factory Method):

  • 如果 Bean 是通過工廠方法創(chuàng)建的,可以使用反射調(diào)用工廠方法。
  • 靜態(tài)工廠方法:
    • 獲取工廠類的 Class 對(duì)象。
    • 獲取工廠方法的 Method 對(duì)象。
    • 調(diào)用 Method.invoke(null, ...),第一個(gè)參數(shù)為 null,表示調(diào)用靜態(tài)方法。
  • 實(shí)例工廠方法:
    • 創(chuàng)建工廠類的實(shí)例。
    • 獲取工廠方法的 Method 對(duì)象。
    • 調(diào)用 Method.invoke(factoryInstance, ...),第一個(gè)參數(shù)為工廠類的實(shí)例。
import java.lang.reflect.Method;
public class MyBean {
    private String message;
    private MyBean(String message) {
        this.message = message;
    }
    // 靜態(tài)工廠方法
    public static MyBean createInstance(String message) {
        return new MyBean(message);
    }
    public String getMessage(){
        return  message;
    }
}
//工廠類
public class MyBeanFactory{
     public MyBean createMyBean(String message){
         return  new MyBean(message);
     }
}
public class CreateBeanWithReflection {
    public static void main(String[] args) throws Exception {
        // 1. 使用靜態(tài)工廠方法
        Class<MyBean> clazz = MyBean.class;
        Method staticFactoryMethod = clazz.getDeclaredMethod("createInstance", String.class);
        MyBean myBean1 = (MyBean) staticFactoryMethod.invoke(null, "Hello from static factory method");
         System.out.println(myBean1.getMessage());
        // 2. 使用實(shí)例工廠方法
        MyBeanFactory factory = new MyBeanFactory(); // 創(chuàng)建工廠實(shí)例
        Method instanceFactoryMethod = MyBeanFactory.class.getDeclaredMethod("createMyBean", String.class);
        MyBean myBean2 = (MyBean) instanceFactoryMethod.invoke(factory, "Hello from instance factory method");
        System.out.println(myBean2.getMessage());
    }
}

4. 使用 BeanUtils (Spring Framework):

  • Spring 的 BeanUtils 類提供了一些便捷的方法來創(chuàng)建 Bean 實(shí)例和操作 Bean 屬性。
  • BeanUtils.instantiateClass()
import org.springframework.beans.BeanUtils;
public class MyBean {
    public MyBean() {
        System.out.println("MyBean created using default constructor.");
    }
}
public class CreateBeanWithReflection {
    public static void main(String[] args) throws Exception {
        // 使用 BeanUtils.instantiateClass()
        MyBean myBean = BeanUtils.instantiateClass(MyBean.class);
    }
}

注意事項(xiàng):

  • 異常處理: 反射操作可能會(huì)拋出各種異常(NoSuchMethodException、IllegalAccessException、InstantiationException、InvocationTargetException 等),需要進(jìn)行適當(dāng)?shù)漠惓L幚怼?/li>
  • 性能: 反射操作通常比直接調(diào)用構(gòu)造函數(shù)或方法要慢一些。如果性能非常關(guān)鍵,應(yīng)盡量避免不必要的反射。
  • 安全性: 如果需要訪問私有構(gòu)造函數(shù)或方法,需要使用 setAccessible(true),但這會(huì)破壞封裝性,應(yīng)謹(jǐn)慎使用。
  • 類型安全: 反射操作是運(yùn)行時(shí)進(jìn)行的,可能會(huì)導(dǎo)致類型安全問題。

到此這篇關(guān)于Spring 中如何使用反射創(chuàng)建 Bean 實(shí)例?的文章就介紹到這了,更多相關(guān)Spring 使用反射創(chuàng)建 Bean 實(shí)例內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 通過Java?Reflection實(shí)現(xiàn)編譯時(shí)注解正確處理方法

    通過Java?Reflection實(shí)現(xiàn)編譯時(shí)注解正確處理方法

    Java注解是一種標(biāo)記在JDK5及以后的版本中引入,用于Java語言中向程序添加元數(shù)據(jù)的方法,這篇文章主要介紹了通過Java?Reflection實(shí)現(xiàn)編譯時(shí)注解處理方法,需要的朋友可以參考下
    2023-06-06
  • java讀取zip/jar包中文件的幾種方式

    java讀取zip/jar包中文件的幾種方式

    這篇文章主要給大家介紹了關(guān)于java讀取zip/jar包中文件的幾種方式,在我們?nèi)粘J褂弥袎嚎s文件是非常常用的,文中通過示例代碼將java讀取zip/jar包中文件的方法介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • springboot?serviceImpl初始化注入對(duì)象實(shí)現(xiàn)方式

    springboot?serviceImpl初始化注入對(duì)象實(shí)現(xiàn)方式

    這篇文章主要介紹了springboot?serviceImpl初始化注入對(duì)象實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Flask接口如何返回JSON格式數(shù)據(jù)自動(dòng)解析

    Flask接口如何返回JSON格式數(shù)據(jù)自動(dòng)解析

    這篇文章主要介紹了Flask接口如何返回JSON格式數(shù)據(jù)自動(dòng)解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • MyBatis 防止 SQL 注入的正確用法

    MyBatis 防止 SQL 注入的正確用法

    文章主要講述了MyBatis防止SQL注入的方法,強(qiáng)調(diào)了使用#{param}進(jìn)行參數(shù)綁定,避免使用${param}拼接SQL,對(duì)于必須使用的${}需做白名單或使用<choose>枚舉替代,并提出了編碼規(guī)范、代碼評(píng)審、審計(jì)與測(cè)試等多層防護(hù)建議,感興趣的朋友一起看看吧
    2026-03-03
  • Java中==與equals()及hashcode()三者之間的關(guān)系詳解

    Java中==與equals()及hashcode()三者之間的關(guān)系詳解

    最近也是在讀Hollis的《深入理解Java核心技術(shù)》里面一節(jié)講到了equals()和hashcode()的關(guān)系,對(duì)于這個(gè)高頻面試點(diǎn),咱們需要認(rèn)真理清一下幾者之間的關(guān)系
    2022-10-10
  • Java解析XML文件開源庫DOM4J

    Java解析XML文件開源庫DOM4J

    dom4j是一個(gè)Java的XML API,是jdom的升級(jí)品,用來讀寫XML文件的。dom4j是一個(gè)十分優(yōu)秀的JavaXML API,具有性能優(yōu)異、功能強(qiáng)大和極其易使用的特點(diǎn),它的性能超過sun公司官方的dom技術(shù),同時(shí)它也是一個(gè)開放源代碼的軟件
    2023-01-01
  • 淺談Java平臺(tái)無關(guān)性

    淺談Java平臺(tái)無關(guān)性

    這篇文章主要介紹了淺談Java平臺(tái)無關(guān)性,對(duì)此感興趣的同學(xué),可以多了解一下
    2021-04-04
  • Java局部?jī)?nèi)部類和匿名內(nèi)部類定義與用法實(shí)例分析

    Java局部?jī)?nèi)部類和匿名內(nèi)部類定義與用法實(shí)例分析

    這篇文章主要介紹了Java局部?jī)?nèi)部類和匿名內(nèi)部類,結(jié)合實(shí)例形式分析了java局部?jī)?nèi)部類和匿名內(nèi)部類相關(guān)定義、原理與用法,需要的朋友可以參考下
    2019-08-08
  • 圖文詳解Java中的序列化機(jī)制

    圖文詳解Java中的序列化機(jī)制

    java中的序列化可能大家像我一樣都停留在實(shí)現(xiàn)Serializable接口上,對(duì)于它里面的一些核心機(jī)制沒有深入了解過。本文將通過示例帶大家深入了解Java中的序列化機(jī)制,需要的可以參考一下
    2022-10-10

最新評(píng)論

吉安县| 隆化县| 桃江县| 浏阳市| 墨玉县| 五常市| 马鞍山市| 深州市| 定兴县| 溧阳市| 定陶县| 井研县| 旺苍县| 儋州市| 桃源县| 鱼台县| 永修县| 逊克县| 卢龙县| 阜阳市| 库伦旗| 洛浦县| 白沙| 龙岩市| 本溪市| 吕梁市| 汽车| 奉节县| 绩溪县| 宝坻区| 阳西县| 桐庐县| 宜川县| 涟水县| 桑日县| 张家港市| 绥滨县| 剑川县| 永春县| 墨脱县| 哈尔滨市|