一、自定義 IOC 框架示例
1、Java 代碼
(1)UserBean 類
public class UserBean {
//定義容器保存框架創建的所有對象
private static Map<String,Object> container = new HashMap<String,Object>();
static {
//使用dom4j解析xml文件讀取bean標籤,將對象創建出來用id爲鍵,對象爲值保存到容器中
SAXReader reader = new SAXReader();
try {
//讀取xml文件
Document document = reader.read("src/spring1.xml");
//獲取根便籤
Element rootElement = document.getRootElement();
//讀取bean標籤,得到對應對象集合
List<Element> beans = rootElement.elements("bean");
//獲取bean標籤中的id作爲鍵,class對象值,並保存到容器中
for(Element b: beans) {
//獲取id鍵
String key = b.attributeValue("id");
//獲取class值
String value = b.attributeValue("class");
//存入容器中
container.put(key, Class.forName(value).newInstance());
}
//根據property標籤定義的依賴關係完成依賴注入
for(Element b: beans) {
//獲取bean下的property標籤
List<Element> properties = b.elements("property");
for(Element p: properties) {
//需要被賦值的屬性名稱
String pName = p.attributeValue("name");
//該屬性需要賦值的對象在容器裏的id
String pRef = p.attributeValue("ref");
//從容器中拿到被依賴的對象
Object refObject = container.get(pRef);
//根據屬性名稱獲取set方法
//根據bean標籤拿到正在循環的這個bean標籤的id
String key = b.attributeValue("id");
//從容器中取出依賴方對象
Object object = container.get(key);
//獲取依賴方的字節碼信息
Class c = object.getClass();
//獲取需要被賦值的屬性對象
Field field = c.getDeclaredField(pName);
//獲取該屬性的set方法
Method method=c.getDeclaredMethod("set"+pName.substring(0, 1).toUpperCase()+pName.substring(1), field.getType());
//調用方法將被依賴對象賦值給依賴對象的目標屬性
method.invoke(object, refObject);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public Object getBean(String id) {
return container.get(id);
}
}
(2)Service 層 UserService 類
public class UserService {
private UserDao userDao;
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void insert() {
System.out.println("執行新增業務");
userDao.insert();
}
}
(3)Dao 層 UserDao 類
public class UserDao {
public void insert() {
System.out.println("執行新增數據");
}
}
(4)Action 層 UserAction類
public class UserAction{
public static void main(String[] args) {
UserBean factory = new UserBean();
UserService service = (UserService) factory.getBean("service");
service.insert();
}
}
2、配置文件
(1)Spring.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="service" class="com.spring.demo1.service.UserService">
<property name="userDao" ref="dao"></property>
</bean>
<bean id="dao" class="com.spring.demo1.dao.UserDao"></bean>
</beans>