FactoryBean接口

/ Spring / 没有评论 / 303浏览

我们知道IOC容器的底层实现是通过Java反射技术实例化配置文件中的对象的。并且通过其它文章中的讲解我们知道IOC容器底层的实现是非常复杂的。spring为了简化IOC容器实例化对象的逻辑,于是提供了FactoryBean接口,通过FactoryBean接口可以让开发人员定制自己的实例化逻辑。FactoryBean接口中包括3个方法,我们分别了解这3个方法的具体功能。

返回FactoryBean接口创建的对象实例,如果isSingleton方法返回true,则该实例会被保存到IOC容器的缓存中。

确定FactoryBean接口创建对象实例的作用域是singleton还是prototype。

返回FactoryBean接口创建对象的类型。

下面我们通过测试用例来演示FactoryBean接口的实际应用。

public class UserFactoryBean implements FactoryBean<User> {

private String init;

public String getInit() {
return init;
}

public void setInit(String init) {
this.init = init;
}

public User getObject() throws Exception {
User user = new User();
String [] inits = getInit().split(" ");
user.setUsername(inits[0]);
user.setPassword(inits[1]);
user.setNickname(inits[2]);
return user;
}

public Class<?> getObjectType() {
return User.class;
}

public boolean isSingleton() {
return false;
}
}
public class User {

private String username;
private String password;
private String nickname;

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getNickname() {
return nickname;
}

public void setNickname(String nickname) {
this.nickname = nickname;
}

@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", nickname='" + nickname + '\'' +
'}';
}
}
<bean id="user" class="com.jilinwula.spring.UserFactoryBean" p:init="admin jilinwula 吉林乌拉"/>
@Test
public void test() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
User user = applicationContext.getBean("user", User.class);
System.out.println(user);
}
User{username='admin', password='jilinwula', nickname='吉林乌拉'}