Spring詳細講解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標簽。
<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詳細講解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-02
SpringBoot @Autowired注解注入規(guī)則介紹
這篇文章主要介紹了SpringBoot @Autowired注解注入規(guī)則介紹,具有很好的參考價值,希望對大家有所幫助。2021-11-11
Java HelloWorld原理分析_動力節(jié)點Java學(xué)院整理
我們初學(xué)java的第一個程序是"hello world"。下面通過實例代碼給大家講解Java HelloWorld原理分析,感興趣的朋友一起學(xué)習(xí)吧2017-05-05
idea2019導(dǎo)入maven項目中的某些問題及解決方法
這篇文章主要介紹了idea2019導(dǎo)入maven項目中的某些問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08
Java設(shè)計模式之建造者模式(Builder模式)介紹
這篇文章主要介紹了Java設(shè)計模式之建造者模式(Builder模式)介紹,本文講解了為何使用建造者模式、如何使用建造者模式、Builder模式的應(yīng)用等內(nèi)容,需要的朋友可以參考下2015-03-03

