写一篇最好懂的FactoryBean
FactoryBean的作用主要是帮助动态代理注册到spring容器。
Person:
package com.mtons.mblog.modules.entity;
/**
* @author Administrator
*/
public class Person {
private String name;
private String address;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person() {
}
}
PersonFactoryBean:
package com.mtons.mblog.modules.entity;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;
/**
* @author Administrator
*/
@Component(value = "personFactoryBean")
public class PersonFactoryBean implements FactoryBean<Person> {
private String personInfo = "gh2,22,address2";
/**
* 返回由FactoryBean创建的bean实例,如果isSingleton()返回true,则该实例会
* 放到Spring容器中单实例缓存池中。
* 通过factorybean代理对象注册给spring,否则代理对象没有文件无法注册给spring的
* @return
* @throws Exception
*/
@Override
public Person getObject() throws Exception {
Person person = new Person () ;
String [] infos = personInfo.split ( "," ) ;
person.setName(infos[0]);
person.setAddress(infos[1]);
person.setAge(Integer.parseInt(infos[2]));
return person;
}
/**
* 返回FactoryBean创建的bean类型。
* @return
*/
@Override
public Class<Person> getObjectType() {
return Person.class;
}
@Override
public boolean isSingleton() {
return true;
}
/**
* 接受逗号分割符设置属性信息
* @param personInfo
*/
public void setPersonInfo(String personInfo) {
this.personInfo = personInfo;
}
}
FactortBeanlTest:
package com.mtons.mblog.modules.service.impl;
import com.mtons.mblog.BootApplication;
import com.mtons.mblog.modules.entity.Person;
import com.mtons.mblog.modules.entity.PersonFactoryBean;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.junit4.SpringRunner;
/**
* post service test
*
* @author saxing 2019/4/5 17:32
*/
//@RunWith(SpringRunner.class)
@SpringBootTest(classes = BootApplication.class)
public class FactortBeanlTest {
@Autowired
PostServiceImpl postService;
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(BootApplication.class, args);
/**
* 当调用getBean("personFactory") 时,Spring通过反射机制发现PersonFactoryBean实现了FactoryBean的接口,
* 这时Spring容器就调用接口方法PersonFactoryBean的getObject()方法返回。
* 如果希望获取PersonFactoryBean的实例,则需要在使用getBean(beanName) 方法时在beanName前显示的加上 "&"
* 前缀,例如getBean("&personFactory")。
*/
PersonFactoryBean personFactory = (PersonFactoryBean) context.getBean("&personFactoryBean");
personFactory.setPersonInfo("gh2,address2,22");
try {
Person person = personFactory.getObject();
//System.out.println("ggggggggggggggggggggggggggggggggggggggggggggggggggggg");
System.out.println(person.getName()+","+person.getAge()+","+person.getAddress());
} catch (Exception e) {
e.printStackTrace();
}
}
}
调试条件断点:
输出:
gh2,22,address2
还没有评论,来说两句吧...