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
請見下一遍文章
:
排版好睏難。。編輯器怎麼用呀。。
如有錯誤,請指出,不勝感激!