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

