Spring詳細(xì)講解FactoryBean接口的使用
FactoryBean是一個接口,創(chuàng)建對象的過程使用了工廠模式。
一、基本使用
讓Spring容器通過FactoryBean來實現(xiàn)對象的創(chuàng)建。
?? 創(chuàng)建FactoryBean案例
public class SimpleFactoryBean implements FactoryBean<Cat> { @Override public Cat getObject() throws Exception { // 創(chuàng)建Cat對象并且返回 return new Cat("Tom"); } @Override public Class<?> getObjectType() { return Cat.class; } }
其實這里就相當(dāng)于在配置文件里創(chuàng)建了一個bean標(biāo)簽。
<bean class="com.text.registrar.SimpleFactoryBean" id="cat"></bean>
?? 需要加載的類
public class Cat { String name; public Cat(String name) { this.name = name; } }
?? 啟動類里面創(chuàng)建方法加載Bean
@SpringBootApplication public class SpringbootApplication { public static void main(String[] args) { ConfigurableApplicationContext run = SpringApplication.run(SpringbootApplication.class, args); } // 等價于配置文件配置 @Bean public SimpleFactoryBean catFactoryBean() { return new SimpleFactoryBean(); } }
二、高級使用
讓Spring容器通過FactoryBean創(chuàng)建指定接口的動態(tài)代理對象。
創(chuàng)建FactoryBean,可以生成任意接口的動態(tài)代理對象
?? 創(chuàng)建一個接口
public interface MyUserMapper { void select(); }
?? 創(chuàng)建一個FactoryBean實現(xiàn)類
可以通過傳入接口的全類名,創(chuàng)建動態(tài)代理對象。
public class MapperFactoryBean implements FactoryBean { /** * 用于保存接口的全類名 */ private String className; public MapperFactoryBean(String className) { this.className = className; } @Override public Object getObject() throws Exception { Class<?> interfaceClass = Class.forName(className); // 生成動態(tài)代理對象返回 Object proxyInstance = Proxy.newProxyInstance(MapperFactoryBean.class.getClassLoader(), new Class[]{interfaceClass}, new InvocationHandler() { @Override public Object invoke(Object o, Method method, Object[] objects) throws Throwable { // 獲取當(dāng)前方法名 System.out.println(method.getName()); if ("select".equals((method.getName()))) { System.out.println(className + "動態(tài)代理對象的select方法被執(zhí)行了??!"); } return null; } }); return proxyInstance; } @Override public Class<?> getObjectType() { try { Class<?> interfaceCLass = Class.forName(className); return interfaceCLass; } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; } }
?? 啟動類里面創(chuàng)建方法加載Bean
@SpringBootApplication public class SpringbootApplication { public static void main(String[] args) { ConfigurableApplicationContext run = SpringApplication.run(SpringbootApplication.class, args); run.getBean(MyUserMapper.class); } // 等價于配置文件配置 @Bean public MapperFactoryBean mapperFactoryBean() { return new MapperFactoryBean("com.test.registrar.MyUserMapper"); } }
到此這篇關(guān)于Spring詳細(xì)講解FactoryBean接口的使用的文章就介紹到這了,更多相關(guān)Spring FactoryBean內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
rabbitmq結(jié)合spring實現(xiàn)消息隊列優(yōu)先級的方法
本篇文章主要介紹了rabbitmq結(jié)合spring實現(xiàn)消息隊列優(yōu)先級的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02java實現(xiàn)飛機(jī)大戰(zhàn)案例詳解
這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)飛機(jī)大戰(zhàn)案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-03-03SpringBoot @Autowired注解注入規(guī)則介紹
這篇文章主要介紹了SpringBoot @Autowired注解注入規(guī)則介紹,具有很好的參考價值,希望對大家有所幫助。2021-11-11Java HelloWorld原理分析_動力節(jié)點Java學(xué)院整理
我們初學(xué)java的第一個程序是"hello world"。下面通過實例代碼給大家講解Java HelloWorld原理分析,感興趣的朋友一起學(xué)習(xí)吧2017-05-05idea2019導(dǎo)入maven項目中的某些問題及解決方法
這篇文章主要介紹了idea2019導(dǎo)入maven項目中的某些問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08Java設(shè)計模式之建造者模式(Builder模式)介紹
這篇文章主要介紹了Java設(shè)計模式之建造者模式(Builder模式)介紹,本文講解了為何使用建造者模式、如何使用建造者模式、Builder模式的應(yīng)用等內(nèi)容,需要的朋友可以參考下2015-03-03