写一篇最好懂的FactoryBean

小灰灰 2023-07-24 11:40 55阅读 0赞

FactoryBean的作用主要是帮助动态代理注册到spring容器。

Person:

  1. package com.mtons.mblog.modules.entity;
  2. /**
  3. * @author Administrator
  4. */
  5. public class Person {
  6. private String name;
  7. private String address;
  8. private int age;
  9. public String getName() {
  10. return name;
  11. }
  12. public void setName(String name) {
  13. this.name = name;
  14. }
  15. public String getAddress() {
  16. return address;
  17. }
  18. public void setAddress(String address) {
  19. this.address = address;
  20. }
  21. public int getAge() {
  22. return age;
  23. }
  24. public void setAge(int age) {
  25. this.age = age;
  26. }
  27. public Person() {
  28. }
  29. }

PersonFactoryBean:

  1. package com.mtons.mblog.modules.entity;
  2. import org.springframework.beans.factory.FactoryBean;
  3. import org.springframework.stereotype.Component;
  4. /**
  5. * @author Administrator
  6. */
  7. @Component(value = "personFactoryBean")
  8. public class PersonFactoryBean implements FactoryBean<Person> {
  9. private String personInfo = "gh2,22,address2";
  10. /**
  11. * 返回由FactoryBean创建的bean实例,如果isSingleton()返回true,则该实例会
  12. * 放到Spring容器中单实例缓存池中。
  13. * 通过factorybean代理对象注册给spring,否则代理对象没有文件无法注册给spring的
  14. * @return
  15. * @throws Exception
  16. */
  17. @Override
  18. public Person getObject() throws Exception {
  19. Person person = new Person () ;
  20. String [] infos = personInfo.split ( "," ) ;
  21. person.setName(infos[0]);
  22. person.setAddress(infos[1]);
  23. person.setAge(Integer.parseInt(infos[2]));
  24. return person;
  25. }
  26. /**
  27. * 返回FactoryBean创建的bean类型。
  28. * @return
  29. */
  30. @Override
  31. public Class<Person> getObjectType() {
  32. return Person.class;
  33. }
  34. @Override
  35. public boolean isSingleton() {
  36. return true;
  37. }
  38. /**
  39. * 接受逗号分割符设置属性信息
  40. * @param personInfo
  41. */
  42. public void setPersonInfo(String personInfo) {
  43. this.personInfo = personInfo;
  44. }
  45. }

FactortBeanlTest:

  1. package com.mtons.mblog.modules.service.impl;
  2. import com.mtons.mblog.BootApplication;
  3. import com.mtons.mblog.modules.entity.Person;
  4. import com.mtons.mblog.modules.entity.PersonFactoryBean;
  5. import org.junit.Test;
  6. import org.junit.runner.RunWith;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.boot.SpringApplication;
  9. import org.springframework.boot.test.context.SpringBootTest;
  10. import org.springframework.context.ApplicationContext;
  11. import org.springframework.test.context.junit4.SpringRunner;
  12. /**
  13. * post service test
  14. *
  15. * @author saxing 2019/4/5 17:32
  16. */
  17. //@RunWith(SpringRunner.class)
  18. @SpringBootTest(classes = BootApplication.class)
  19. public class FactortBeanlTest {
  20. @Autowired
  21. PostServiceImpl postService;
  22. public static void main(String[] args) {
  23. ApplicationContext context = SpringApplication.run(BootApplication.class, args);
  24. /**
  25. * 当调用getBean("personFactory") 时,Spring通过反射机制发现PersonFactoryBean实现了FactoryBean的接口,
  26. * 这时Spring容器就调用接口方法PersonFactoryBean的getObject()方法返回。
  27. * 如果希望获取PersonFactoryBean的实例,则需要在使用getBean(beanName) 方法时在beanName前显示的加上 "&"
  28. * 前缀,例如getBean("&personFactory")。
  29. */
  30. PersonFactoryBean personFactory = (PersonFactoryBean) context.getBean("&personFactoryBean");
  31. personFactory.setPersonInfo("gh2,address2,22");
  32. try {
  33. Person person = personFactory.getObject();
  34. //System.out.println("ggggggggggggggggggggggggggggggggggggggggggggggggggggg");
  35. System.out.println(person.getName()+","+person.getAge()+","+person.getAddress());
  36. } catch (Exception e) {
  37. e.printStackTrace();
  38. }
  39. }
  40. }

调试条件断点:

v2-dafb63788996a73d6104b391121cb7b7\_b.jpg

输出:

gh2,22,address2

发表评论

表情:
评论列表 (有 0 条评论,55人围观)

还没有评论,来说两句吧...

相关阅读

    相关 给我朋友

      感觉时间过的真的好快好快,曾经前后桌打闹,互怼,一起学习的我们,转眼便已在各自的大学。     再仔细想想,我们认识了才三年,却像拥有着十年感情的老友,这一点其实高二高三