设计模式:23种
    常用的由:单例模式,工厂模式,代理模式,模板模式……

    工厂模式:相当于是工厂的作用,创建出对象,之后如果需要用到对象,可以直接去工厂拿就行。
    当前案例使用工厂模式是因为beans不止一个,所以使用工厂模式。
    当前安利的操作是将xml中的数据封装到BeanConfig中,使用工厂模式的概念

    1.BeanFactory首先加载xml配置文件 - 静态代码块
    2.将每一个bean标签配置内容,封装到BeanConfig中去
    2.最后将xml中的内容封装到一个容器中去,便于快速查询,map进行数据存储

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <beans>
    3. <bean id="userID001" className="Day02_Demo.Demo02.User">
    4. <property name = "uid" value = "u001">
    5. </property>
    6. <property name = "userName" value = "jack">
    7. </property>
    8. <property name = "passWord" value = "1234165">
    9. </property>
    10. </bean>
    11. <bean id = "bookId002" className="Day02_Demo.Demo02.Book">
    12. <property name = "bid" value = "u001">
    13. </property>
    14. <property name = "title" value = "java从入门到放弃">
    15. </property>
    16. <property name = "price" value = "88">
    17. </property>
    18. </bean>
    19. </beans>
    1. package Day02_Demo.Demo02;/*
    2. @create 2020--12--23--11:19
    3. */
    4. public class Book {
    5. private String bid;
    6. private String title;
    7. private Integer price;
    8. public Book() {
    9. }
    10. public Book(String bid, String title, Integer price) {
    11. this.bid = bid;
    12. this.title = title;
    13. this.price = price;
    14. }
    15. @Override
    16. public String toString() {
    17. return "Book{" +
    18. "bid='" + bid + '\'' +
    19. ", title='" + title + '\'' +
    20. ", price=" + price +
    21. '}';
    22. }
    23. public String getBid() {
    24. return bid;
    25. }
    26. public void setBid(String bid) {
    27. this.bid = bid;
    28. }
    29. public String getTitle() {
    30. return title;
    31. }
    32. public void setTitle(String title) {
    33. this.title = title;
    34. }
    35. public Integer getPrice() {
    36. return price;
    37. }
    38. public void setPrice(Integer price) {
    39. this.price = price;
    40. }
    41. }
    1. package Day02_Demo.Demo02;/*
    2. @create 2020--12--23--11:21
    3. */
    4. public class User {
    5. private String uid;
    6. private String userName;
    7. private String passWord;
    8. @Override
    9. public String toString() {
    10. return "User{" +
    11. "uid='" + uid + '\'' +
    12. ", userName='" + userName + '\'' +
    13. ", passWord='" + passWord + '\'' +
    14. '}';
    15. }
    16. public String getUid() {
    17. return uid;
    18. }
    19. public void setUid(String uid) {
    20. this.uid = uid;
    21. }
    22. public String getUserName() {
    23. return userName;
    24. }
    25. public void setUserName(String userName) {
    26. this.userName = userName;
    27. }
    28. public String getPassWord() {
    29. return passWord;
    30. }
    31. public void setPassWord(String passWord) {
    32. this.passWord = passWord;
    33. }
    34. public User(String uid, String userName, String passWord) {
    35. this.uid = uid;
    36. this.userName = userName;
    37. this.passWord = passWord;
    38. }
    39. public User() {
    40. }
    41. }
    1. package Day02_Demo.Demo02;/*
    2. @create 2020--12--23--11:23
    3. */
    4. import java.util.Properties;
    5. /**
    6. * javaBean的配置对象
    7. * BeanConfig文件用于将对应的xml的配置项,解析封装到xml对象中
    8. * 属性:id,className,properties
    9. *
    10. * 当前实体类的实例化bean.xml文件,相当于是一个属性配置文件的中转站
    11. * 后面进行的操作都是通过这个中转站处理
    12. */
    13. public class BeanConfig {
    14. private String id;
    15. private String className;
    16. //用于解析当前的这个bean中所有的属性,所以直接创建一个properties对象
    17. private Properties props = new Properties();
    18. public BeanConfig() {
    19. }
    20. public BeanConfig(String id, String className, Properties props) {
    21. this.id = id;
    22. this.className = className;
    23. this.props = props;
    24. }
    25. public String getId() {
    26. return id;
    27. }
    28. public void setId(String id) {
    29. this.id = id;
    30. }
    31. public String getClassName() {
    32. return className;
    33. }
    34. public void setClassName(String className) {
    35. this.className = className;
    36. }
    37. public Properties getProps() {
    38. return props;
    39. }
    40. public void setProps(Properties props) {
    41. this.props = props;
    42. }
    43. @Override
    44. public String toString() {
    45. return "BeanConfig{" +
    46. "id='" + id + '\'' +
    47. ", className='" + className + '\'' +
    48. ", props=" + props +
    49. '}';
    50. }
    51. }
    1. package Day02_Demo.Demo02;/*
    2. @create 2020--12--23--14:00
    3. */
    4. import org.apache.commons.beanutils.BeanUtils;
    5. import org.dom4j.Document;
    6. import org.dom4j.Element;
    7. import org.dom4j.io.SAXReader;
    8. import javax.management.relation.RoleUnresolved;
    9. import java.lang.annotation.ElementType;
    10. import java.util.HashMap;
    11. import java.util.List;
    12. import java.util.Map;
    13. /**
    14. * 设计模式:23种
    15. * 常用的由:单例模式,工厂模式,代理模式,模板模式……
    16. * <p>
    17. * 工厂模式:相当于是工厂的作用,创建出对象,之后如果需要用到对象,可以直接去工厂拿就行。
    18. * 当前案例使用工厂模式是因为beans不止一个,所以使用工厂模式。
    19. * 当前安利的操作是将xml中的数据封装到BeanConfig中,使用工厂模式的概念
    20. * <p>
    21. * 1.BeanFactory首先加载xml配置文件 - 静态代码块
    22. * 2.将每一个bean标签配置内容,封装到BeanConfig中去
    23. * 2.最后将xml中的内容封装到一个容器中去,便于快速查询,map进行数据存储
    24. */
    25. public class BeanFactory {
    26. //1.提供Map存放beans.xml中的配置文件内容,使用Map,建议使用静态处理 - 好处是只要加载一次
    27. private static Map<String, BeanConfig> cache = new HashMap<>();
    28. //静态块处理数据添加 - 直接使用静态块一次性加载
    29. static{
    30. try {
    31. //加载xml,获取document
    32. SAXReader saxReader = new SAXReader();
    33. Document document = saxReader.read("xml//bean.xml");
    34. //获取根元素
    35. Element rootElement = document.getRootElement();
    36. //获取所有的bean元素,当前子元素不止一个,所以使用list
    37. List<Element> allBeanElement = rootElement.elements("bean");
    38. //遍历集合
    39. for (Element beanElement : allBeanElement) {
    40. //属性:id className
    41. String id = beanElement.attributeValue("id");
    42. String className = beanElement.attributeValue("className");
    43. //创建beanConfig,并且封装id和className
    44. BeanConfig beanConfig = new BeanConfig();
    45. beanConfig.setId(id);
    46. beanConfig.setClassName(className);
    47. //获取子标签 - property
    48. List<Element> allProperty = beanElement.elements("property");
    49. for (Element propElement : allProperty) {
    50. //获取属性:name value
    51. String name = propElement.attributeValue("name");
    52. String value = propElement.attributeValue("value");
    53. //将name和value保存到BeanConfig
    54. beanConfig.getProps().setProperty(name, value);
    55. }//内层for
    56. //将封装好的数据保存到map中
    57. cache.put(id, beanConfig);
    58. }//外层for
    59. System.out.println("初始化数据:" + cache);
    60. } catch (Exception e) {
    61. throw new RuntimeException(e);
    62. }
    63. }
    64. //因为这是一个工厂,得有提供对象的方法 - 外面需要的时候可以通过这个方法来拿对象
    65. //通过指定的beanId来获取相对应的BeanConfig
    66. public static Object getBean(String beanId) {
    67. //创建beanId获取相应的BeanConfig
    68. BeanConfig beanConfig = cache.get(beanId);
    69. //判断这个对象是不是合法
    70. if (beanConfig == null) {
    71. throw new RuntimeException("获得的对象[" + beanId + "]不存在");
    72. }
    73. //如果存在 - 通过反射机制进行获取
    74. try {
    75. String className = beanConfig.getClassName();
    76. Class clazz = Class.forName(className);
    77. Object obj = clazz.newInstance();//获取实例对象
    78. //循环解析 - beanUtils
    79. //stringPropertyNames()方法是从Properties的api中提供的,作用是获取到属性名字的字符串类型
    80. for (String name : beanConfig.getProps().stringPropertyNames()) {
    81. //每遍历到一个name,就返回name对应的value
    82. String value = beanConfig.getProps().getProperty(name);
    83. //使用BeanUtils封装数据
    84. BeanUtils.setProperty(obj, name, value);
    85. }
    86. return obj;
    87. } catch (Exception e) {
    88. throw new RuntimeException(e);
    89. }
    90. }
    91. }
    1. package Day02_Demo.Demo02;/*
    2. @create 2020--12--23--14:39
    3. */
    4. import org.junit.Test;
    5. /**
    6. * 测试类
    7. */
    8. public class XMLTest {
    9. @Test
    10. public void test() {
    11. //通过实例化数据的方法获取
    12. User user = (User) BeanFactory.getBean("userID001");
    13. System.out.println(user);
    14. Book book = (Book) BeanFactory.getBean("bookId002");
    15. System.out.println(book);
    16. }
    17. }