单例Bean工厂的实现

1. 准备数据库环境

# 新建用户表
CREATE TABLE IF NOT EXISTS `user` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(32) NOT NULL COMMENT '用户名称',
  `birthday` DATETIME DEFAULT NULL COMMENT '生日',
  `sex` CHAR(1) DEFAULT NULL COMMENT '性别',
  `address` VARCHAR(256) DEFAULT NULL COMMENT '地址',
  `password` VARCHAR(100) DEFAULT NULL COMMENT '密码',
  CONSTRAINT pk_user PRIMARY KEY (`id`)
);

# 添加用户数据
INSERT  INTO 
  `user`(`id`,`username`,`birthday`,`sex`,`address`,`password`) 
VALUES 
(1,'周瑜','2020-02-27 17:47:08','男','吴国','123456'),
(2,'大乔','2020-02-27 15:09:37','女','吴国','123456'),
(3,'小乔','2020-02-27 11:34:34','女','吴国','123456'),
(4,'陆逊','2020-02-27 12:04:06','男','吴国','123456'),
(5,'孙策','2020-02-27 17:37:26','男','东吴','123456'),
(6,'孙权','2020-02-27 11:44:00','男','吴国','123456');

2. 创建maven工程

在这里插入图片描述

3. 项目依赖

<dependencies>
    <!-- mysql -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.49</version>
    </dependency>
    <!-- lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.12</version>
    </dependency>
</dependencies>

4. 项目工程结构

在这里插入图片描述

5. Bean工厂配置文件

# Bean配置文件

# 用户持久层Bean
userDao=zw.spring.dao.impl.UserDaoImpl

# 用户业务层Bean
userService=zw.spring.service.impl.UserServiceImpl

6. Bean工厂工具类

package zw.spring.util;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * @className BeanFactoryUtil
 * @description Bean工厂工具类
 * @author 周威
 * @date 2020-09-08 11:20
 **/
public class BeanFactoryUtil
{
    // 定义Bean配置文件名
    private static final String CONFIG_FILE_NAME = "beanfactory_config.properties";
    // 定义Bean配置集合
    private static Properties properties;
    // 定义Bean存储容器
    private static Map<String, Object> container;

    static
    {
        InputStream is = null;
        try
        {
            // 创建集合容器
            properties = new Properties();
            // 获取配置文件字节输入流
            is = BeanFactoryUtil.class.getClassLoader().getResourceAsStream(CONFIG_FILE_NAME);
            // 加载配置文件内容到集合
            properties.load(is);
            // 创建Bean容器
            container = new HashMap<>();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                // 关闭流资源
                if (is != null)
                {
                    is.close();
                }
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }

    /**
     * 创建Bean
     * @param beanName
     * @return Bean对象
     */
    public static Object createBean(String beanName)
    {
        // 从Bean容器获取Bean
        Object object = container.get(beanName);
        if (object == null)
        {
            try
            {
                // 获取字节码对象
                Class classObject = Class.forName(properties.getProperty(beanName));
                // 创建Bean对象
                object = classObject.newInstance();
                // 将Bean对象存入Bean容器
                container.put(beanName, object);
            }
            catch (ClassNotFoundException e)
            {
                e.printStackTrace();
            }
            catch (IllegalAccessException e)
            {
                e.printStackTrace();
            }
            catch (InstantiationException e)
            {
                e.printStackTrace();
            }
        }
        return object;
    }
}

7. 数据库工具类

package zw.spring.util;

import java.sql.*;

/**
 * @className DBUtil
 * @description 数据库工具类
 * @author 周威
 * @date 2020-09-08 11:11
 **/
public class DBUtil
{
    // 数据库连接四个条件
    private static final String JDBC_MYSQL_DRIVER = "com.jdbc.mysql.Driver";
    private static final String JDBC_MYSQL_URL = "jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=false";
    private static final String JDBC_MYSQL_USERNAME = "root";
    private static final String JDBC_MYSQL_PASSWORD = "root";

    // 注册数据库驱动
    static
    {
        try
        {
            Class.forName(JDBC_MYSQL_DRIVER);
        }
        catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        }
    }

    /**
     * 获取数据库连接
     * @return 数据库连接对象
     */
    public static Connection getConnection()
    {
        Connection connection = null;
        try
        {
            connection = DriverManager.getConnection(JDBC_MYSQL_URL, JDBC_MYSQL_USERNAME, JDBC_MYSQL_PASSWORD);
        }
        catch (SQLException throwables)
        {
            throwables.printStackTrace();
        }
        return connection;
    }

    /**
     * 关闭数据库连接资源
     * @param connection
     * @param preparedStatement
     * @param resultSet
     */
    public static void closeConnection(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet)
    {
        try
        {
            if (resultSet != null)
            {
                resultSet.close();
            }
            if (preparedStatement != null)
            {
                preparedStatement.close();
            }
            if (connection != null)
            {
                connection.close();
            }
        }
        catch (SQLException throwables)
        {
            throwables.printStackTrace();
        }
    }
}

8. 用户实体类

package zw.spring.domain;

import lombok.Data;
import java.io.Serializable;
import java.util.Date;

/**
 * @className UserDO
 * @description 用户实体类
 * @author 周威
 * @date 2020-09-08 9:01
 **/
@Data
public class UserDO implements Serializable
{
    /* 用户编号 */
    private Integer id;

    /* 用户账号 */
    private String username;

    /* 用户密码 */
    private String password;

    /* 用户生日 */
    private Date birthday;

    /* 用户性别 */
    private String sex;

    /* 用户籍贯 */
    private String address;
}

9. 用户持久层接口

package zw.spring.dao;

import zw.spring.domain.UserDO;
import java.util.List;

/**
 * @className UserDao
 * @description 用户持久层接口
 * @author 周威
 * @date 2020-09-08 11:29
 **/
public interface UserDao
{
    /**
     * 查询用户信息,查询所有用户信息
     * @return 用户信息列表
     */
    List<UserDO> listUserInformations();
}

10. 用户持久层实现类

package zw.spring.dao.impl;

import zw.spring.dao.UserDao;
import zw.spring.domain.UserDO;
import zw.spring.util.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @className UserDaoImpl
 * @description 用户持久层实现类
 * @author 周威
 * @date 2020-09-08 11:31
 **/
public class UserDaoImpl implements UserDao
{
    @Override
    public List<UserDO> listUserInformations()
    {
        List<UserDO> result = new ArrayList<>();

        // 定义数据库连接资源
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        try
        {
            // 准备SQL语句
            String sql = "select * from user";
            // 获取数据库连接对象
            connection = DBUtil.getConnection();
            // 获取数据库预处理对象
            preparedStatement = connection.prepareStatement(sql);
            // 执行SQL语句,获取查询结果集
            resultSet = preparedStatement.executeQuery();
            // 遍历结果集
            while (resultSet.next())
            {
                // 解析结果集
                Integer id = resultSet.getInt("id");
                String username = resultSet.getString("username");
                String password = resultSet.getString("password");
                Date birthday = resultSet.getDate("birthday");
                String sex = resultSet.getString("sex");
                String address = resultSet.getString("address");

                // 组装用户数据
                UserDO user = new UserDO();
                user.setId(id);
                user.setUsername(username);
                user.setPassword(password);
                user.setBirthday(birthday);
                user.setSex(sex);
                user.setAddress(address);

                // 将用户数据存入容器
                result.add(user);
            }
        }
        catch (SQLException throwables)
        {
            throwables.printStackTrace();
        }
        finally
        {
            // 关闭数据库相关资源
            DBUtil.closeConnection(connection, preparedStatement, resultSet);
        }
        return result;
    }
}

11. 用户业务层接口

package zw.spring.service;

import zw.spring.domain.UserDO;
import java.util.List;

/**
 * @className UserService
 * @description 用户业务层接口
 * @author 周威
 * @date 2020-09-08 11:48
 **/
public interface UserService
{
    /**
     * 查询用户信息业务,查询所有用户信息
     * @return 用户信息列表
     */
    List<UserDO> lisetUserInformations();
}

12. 用户业务层实现类

package zw.spring.service.impl;

import zw.spring.dao.UserDao;
import zw.spring.domain.UserDO;
import zw.spring.service.UserService;
import zw.spring.util.BeanFactoryUtil;
import java.util.List;

/**
 * @className UserServiceImpl
 * @description 用户业务层实现类
 * @author 周威
 * @date 2020-09-08 11:50
 **/
public class UserServiceImpl implements UserService
{
    // 注入用户持久层Bean
    private UserDao userDao = (UserDao) BeanFactoryUtil.createBean("userDao");

    @Override
    public List<UserDO> lisetUserInformations()
    {
        return userDao.listUserInformations();
    }
}

13. 用户表现层控制器

package zw.spring.controller;

import zw.spring.domain.UserDO;
import zw.spring.service.UserService;
import zw.spring.util.BeanFactoryUtil;
import java.util.List;

/**
 * @className UserController
 * @description 用户表现层控制器
 * @author 周威
 * @date 2020-09-08 11:52
 **/
public class UserController
{
    public static void main(String[] args)
    {
        // 注入用户业务层Bean
        UserService userService = (UserService) BeanFactoryUtil.createBean("userService");
        // 进行查询业务信息处理
        List<UserDO> users = userService.lisetUserInformations();
        // 打印用户信息
        for (UserDO user : users)
        {
            System.out.println("user = " + user);
        }
    }
}

14. 运行测试

在这里插入图片描述

15. 单例工厂测试类

package zw.spring.controller;

import zw.spring.service.UserService;
import zw.spring.util.BeanFactoryUtil;

/**
 * @className TestController
 * @description 单例Bean工厂测试类
 * @author 周威
 * @date 2020-09-08 12:20
 **/
public class TestController
{
    public static void main(String[] args)
    {
        for (int i = 0; i < 10; i++)
        {
            UserService userService = (UserService) BeanFactoryUtil.createBean("userService");
            System.out.println("userService = " + userService);
        }
    }
}

16. 运行测试

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值