1. 程式人生 > >Spring --- 簡單模擬 IOC容器

Spring --- 簡單模擬 IOC容器

文章目錄

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

請見下一遍文章


排版好睏難。。編輯器怎麼用呀。。

如有錯誤,請指出,不勝感激!