1.BeanFactory & FactoryBean区别
spring中的bean分两种,一种是普通的bean一种是FactoryBean,FactoryBean使用bean结尾说明他也是一个bean,不同的FactoryBean是一个工厂类接口,我们可以使用FactoryBean<T>自定义实例化Bean。获取factorybean返回的就是FactoryBean的getObject方法返回的对象,是不是单例的也是由FactoryBean
.isSingleton方法决定。
获取FactoryBean对象本身,需要在id前面加一个&符号来获取
如果一些bean的构造方式比较复杂,我们可以使用FactoryBean自定义它的实例化逻辑
2.FactoryBean使用示例
业务说明:使用FactoryBean自定义ioc当中User这个对象的示例化过程
/**
* 实体类
*/
public class User {
private String id;
private String name;
public User(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
* 定义user这个bean生成的自定义逻辑,UserFactoryBean
*/
public class UserFactoryBean implements FactoryBean<User> {
@Override
public User getObject() throws Exception {
return new User("1", "admin");
}
@Override
public Class<?> getObjectType() {
return User.class;
}
//是否是单例的
@Override
public boolean isSingleton() {
return true;
}
}
/**
* 创建一个获取springApplicationContext的工具
*/
@Component
public class SpringContextAware implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
}
/**
* 配置这个用户bean
*/
@Bean(name = "user")
public UserFactoryBean getUserFactoryBean() {
return new UserFactoryBean();
}
测试代码
//获取bean name 为user 的类
Object obj1 = SpringContextAware.getBean("user");
System.out.println(obj1);
//获取factory bean 本身加&
Object obj2 = SpringContextAware.getBean("&user");
System.out.println(obj2);
控制台结果
com.example.depy.democontrol.entity.User@1113517a
com.example.depy.democontrol.config.UserFactoryBean@4e0f5d0d
网友评论