Spring 架構的簡單模擬實現
Spring 架構主要有兩大特點:
IOC /DI: 控制反轉/依賴注入
AOP 切面程式設計 .
今天主要是實現IOC這一特點.
主要的邏輯如下:
User 使用者類.
UserDAO User類的訪問介面.
UserDAOImpl 實現UserDAO 介面以實現擴充.
UserService 包含一系列的使用者功能 ,如addUser
關於以上類的程式碼:
package com.bjsxt.model;
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
package com.bjsxt.dao;
import com.bjsxt.model.User;
public interface UserDAO {
public void save(User user);
}
package com.bjsxt.dao.impl;
import com.bjsxt.dao.UserDAO;
import com.bjsxt.model.User;
public class UserDAOImpl implements UserDAO {
public void save(User user) {
//Hibernate
//JDBC
//XML
//NetWork
System.out.println("user saved!");
}
}
package com.bjsxt.service;
import com.bjsxt.dao.UserDAO;
import com.bjsxt.model.User;
public class UserService {
private UserDAO userDAO;
public void add(User user) {
userDAO.save(user);
}
public UserDAO getUserDAO() {
return userDAO;
}
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
}
然後執行test程式碼
import com.bjsxt.dao.UserDAO;
import com.bjsxt.dao.impl.UserDAOImpl;
import com.bjsxt.model.User;
import com.bjsxt.service.UserService;
import com.bjsxt.spring.BeanFactory;
import com.bjsxt.spring.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args)throws Exception{
UserService service =new UserService();
UserDAO userdao =new UserDAOImpl();
service.setUserDAO(userdao);
User u =new User();
service.add(u);
}
}
注意這裡直接用UserDAOImpl() 來代替UserDAO , 也是體現物件導向的靈活性. 比如可以針對不同的資料庫設計不同的UserDAOImpl().
為了實現IOC 的裝配功能, 比如說我不想在 程式碼中體現new 的是哪種UserDAO的實現, 而是直接在配置檔案中進行設定.
配置檔案beans.xml如下:
<beans>
<bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl" />
<bean id="userService" class="com.bjsxt.service.UserService" >
<property name="userDAO" bean="u"/>
</bean>
</beans>
這裡可以根據bean 的id userService 找到 所屬的UserService類, 在屬性userDAO中 ,設定其為id 為 "u"的bean . 而上述檔案中的 id 為"u"的bean , 就是UserDAOImp .
當然, 需要藉助Factory 介面 和該介面的實現類 ClassPathXmlApplicationContext .
package com.bjsxt.spring;
public interface BeanFactory {
public Object getBean(String id);
}
package com.bjsxt.spring;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
public class ClassPathXmlApplicationContext implements BeanFactory {
private Map<String , Object> beans = new HashMap<String, Object>();
//IOC Inverse of Control DI Dependency Injection
public ClassPathXmlApplicationContext() throws Exception {
SAXBuilder sb=new SAXBuilder();
Document doc=sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml")); //構造文件物件
Element root=doc.getRootElement(); //獲取根元素HD
List list=root.getChildren("bean");//取名字為bean的所有元素
for(int i=0;i<list.size();i++){
Element element=(Element)list.get(i);
String id=element.getAttributeValue("id");
String clazz=element.getAttributeValue("class");
Object o = Class.forName(clazz).newInstance();
System.out.println(id);
System.out.println(clazz);
beans.put(id, o);
for(Element propertyElement : (List<Element>)element.getChildren("property")) {
String name = propertyElement.getAttributeValue("name"); //userDAO
String bean = propertyElement.getAttributeValue("bean"); //u
Object beanObject = beans.get(bean);//UserDAOImpl instance
String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
System.out.println("method name = " + methodName);
Method m = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);
m.invoke(o, beanObject);
}
}
}
public Object getBean(String id) {
return beans.get(id);
}
}
ClassPathXmlApplicationContext 利用反射機制, 在建構函式中根據xml檔案內容實現裝配功能.
新的test函式:
import com.bjsxt.dao.UserDAO;
import com.bjsxt.dao.impl.UserDAOImpl;
import com.bjsxt.model.User;
import com.bjsxt.service.UserService;
import com.bjsxt.spring.BeanFactory;
import com.bjsxt.spring.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args)throws Exception{
BeanFactory factory =new ClassPathXmlApplicationContext();
UserService service =(UserService)factory.getBean("userService");
// UserDAO userdao =new UserDAOImpl();
// service.setUserDAO(userdao);
User u =new User();
service.add(u);
}
}
相關文章
- 簡單的string類的模擬實現
- 簡單實現.NET Hook與事件模擬Hook事件
- 簡單實現微服務架構的實踐分享微服務架構
- Proteus實現簡單51程式的設計與模擬
- javascript模擬實現私有屬性簡單介紹JavaScript
- 【Tomcat】Tomcat工作原理及簡單模擬實現Tomcat
- js模擬實現名稱空間簡單介紹JS
- 模擬實現簡易版shell
- 重構 JAVA 聊天室 —— CS 模式的簡單架構實現Java模式架構
- 菜鳥學SSH(十五)——簡單模擬Hibernate實現原理
- 簡單地聊一聊Spring Boot的構架Spring Boot
- mvc架構的簡單實踐----使用者註冊的實現MVC架構
- 實戰模擬│單點登入 SSO 的實現
- 模擬簡單的動態代理
- 透過簡單實現 PHP 請求模擬賺了 50 元PHP
- 海柔模擬系統儲存實踐:混合雲架構下實現高可用與極簡運維架構運維
- oracle實用sql(13)--併發簡單模擬OracleSQL
- promise的模擬實現Promise
- 實現一個簡單的虛擬DOM
- 虛擬Dom與Diff的簡單實現
- 簡單易用的前端模擬資料前端
- 簡單實現類似Spring的Aop原理實現Spring
- MVVM架構在Flutter中的簡單實踐MVVM架構Flutter
- 自己簡單實現Spring的IOC原理Spring
- Cable:360實現的新虛擬網路架構架構
- javascript模擬new的實現JavaScript
- JavaScript 模擬new的實現JavaScript
- 簡單模擬javaScript物件導向JavaScript物件
- 簡易版的Spring框架之IOC簡單實現Spring框架
- 微服務架構專案實戰:Spring Boot 如何建立簡單的 REST 服務微服務架構Spring BootREST
- SearchView的簡單使用和模擬搜尋View
- 模擬data block lost write的簡單方法BloC
- 簡單機器語言的模擬 (轉)
- BPAAS 簡單架構圖架構
- 超簡單易懂的LNMP架構LNMP架構
- latch: cache buffers chains-熱塊的簡單模擬實驗AI
- 使用 Spring Boot 構建可重用的模擬模組Spring Boot
- javascript模擬實現replaceAll()JavaScript