Spring --- 简单模拟 IOC容器

版权声明:Hi https://blog.csdn.net/qq_33417486/article/details/83989365

Double 的 Spring

一 Spring介绍

1. 概念

​ 废话的介绍不多说了。

​ Spring是一种 一站式轻量级的框架,其有两大核心功能:IOC 和 AOP

​ 1.1 一站式

​ Spring 可以对 dao、service、web层提供支持。

​ 1.2 轻量级

​ Spring框架可以更合理的分配资源,使用最小的资源完成当前的需求。

2. 两大核心功能

2.1 IOC 容器

         	       **概念**

​ IOC 即控制反转,将程序员手动new来创建对象的操作转变为从Spring工厂的IOC容器中获取对象

也就是将对象的创建权交给(反转给)Spring的IOC容器。

		**优点**

​ 1)实现了程序间的解耦

​ 2) 提高了运行效率

​ 3)减小了服务器压力(减少了new的使用)

自定义IOC容器

数据库准备

(本次先不使用数据库中的数据)

​ 1)创建数据库:

​ CREATE DATABASE springdb;

​ 2)新建account账户表

​ create table account(

	id int primary key auto_increment,
	name varchar(40),
	money Double

​ )character set utf8 collate utf8_general_ci;

​ 3)插入数据

​ insert into account(name,money) values(‘兔兔’,1000);
​ insert into account(name,money) values(‘Double’,1000);
​ insert into account(name,money) values(‘毛毛’,1000);

​ 4)数据库截图

​ SELECT * FROM account;

在这里插入图片描述

项目环境搭建:

​ 1)创建MAVEN工程,导入JAR包坐标

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>
    </dependencies>

​ 2)编写Account类

public class Account {
    private Integer id;
    private String name;
    private Double money;
      //Getter and Setter...
      //toString()...
}

​ 3)编写DAO接口类 及其 实现类

public interface IAccountDAO {
	//储存Account
    void save(Account account);
}
public class AccountDAOImpl implements IAccountDAO {
    @Override
    public void save(Account account) {
        //模拟数据库存数据
        System.out.println("存储成功" + account);
    }
}

​ 3)编写Service接口类 及其实现类

public interface IAccountService {
    void saveAccount(Account account);
}
public class AccountServiceImpl implements IAccountService {
    @Override
    public void saveAccount(Account account) {
        /*获取DAO对象第一种方式
        *IAccountDAO accountDAO = new AccountDAOImpl();
        *业务层调用持久层,此方式耦合性太大,业务层依赖持久层的接口和实现类。若无实现类则无法通过编译,应杜绝这种编译期的依赖关系
        */
      	/*获取DAO对象第一种方式--利用反射
      	如果没有实现类也可以编译(不能运行),但全限定类名写死在类中,应避免硬编码。
      	*/
      	/*IAccountService accountService =
        IAccountService) Class.forName("com.tutu.dao.impl.AccountDAOImpl").newInstance();
      	*/
        /*利用工厂模式,使用配置文件,创建BeanFactory类,提供获取对象的工厂,bean.xml配置文件*/
      	BeanFactory factory = new BeanFactory();
         IAccountDAO accountDAO = (IAccountDAO) factory.getBean("accountDAO");
      
         accountDAO.save(account);
    }
}
4)bean.xml
<beans>
    <!--DAO对象-->
    <bean id="accountDAO" class="com.tutu.dao.impl.AccountDAOImpl"></bean>
    <!--Service对象-->
    <bean id="accountService" class="com.tutu.service.impl.AccountServiceImpl"></bean>
</beans>

​ 5) BeanFactory类

public class BeanFactory {
    private static Map<String, Object> map = new HashMap<>();
	//随字节码的加载,先根据配置文件提前把需要的对象都创建出来(单例的),需要用的时候再取出。
    static {
        //将bean.xml变成流
        InputStream is=
          BeanFactory.class.getClassLoader().getResourceAsStream("bean.xml");
        SAXReader sr = new SAXReader();
        //存入的对象
        Object obj = null;
        Document document = null;
        try {
            //将配置文件转换为文档
            document = sr.read(is);
            //获得根结点
            Element rootElement = document.getRootElement();
            //获取根结点下所有的bean元素
            List<Element> elements = rootElement.elements("bean");
            for (Element element : elements) {
                //获取对象名
                String id = element.attributeValue("id");
                //获取实现类全限定类名
                String clazz = element.attributeValue("class");
                //创建对象
                obj = Class.forName(clazz).newInstance();
                //存入map集合
                map.put(id, obj);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public Object getBean(String bean) throws Exception {
        return map.get(bean);
    }
}

​ 6)测试类

public class Demo {
    @Test
    public void testDemo01() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        Account account = new Account();
        account.setId(1);
        account.setName("兔兔");
        account.setMoney(1000d);
        //创建service对象同dao
      	BeanFactory factory = new BeanFactory();
        IAccountService accountService =
          (IAccountService)factory.getBean("accountService");
        accountService.saveAccount(account);
    }
}

​ 7)测试结果

在这里插入图片描述

2.2 AOP

请见下一遍文章


排版好困难。。编辑器怎么用呀。。

如有错误,请指出,不胜感激!

猜你喜欢

转载自blog.csdn.net/qq_33417486/article/details/83989365