Spring3_模拟Spring框架工作原理 用户模型类User.java package com.bebig.model; public class User { private String username; private String password; public String getPassword() { return password; } public String getUsername() { return username; } public void setPassword(String password) { this.password = password; } public void setUsername(String username) { this.username = username; } } 数据访问接口UserDAO.java ### Spring3工作原理详解 #### 一、Spring框架概述 Spring框架是一个开源的Java平台,提供了全面的基础架构支持,让开发者能够轻松构建企业级应用。它最初由Rod Johnson创建,并于2004年发布了第一个版本。Spring的核心特性是依赖注入(Dependency Injection, DI)和面向切面编程(Aspect Oriented Programming, AOP)。通过这些特性,Spring框架极大地简化了Java应用的开发过程。 #### 二、重要组件分析 ##### 1. 用户模型类:User.java 在Spring框架中,业务实体通常被设计为简单的Java Bean。`User.java`就是一个典型的例子: ```java package com.bebig.model; public class User { private String username; private String password; public String getPassword() { return password; } public String getUsername() { return username; } public void setPassword(String password) { this.password = password; } public void setUsername(String username) { this.username = username; } } ``` 这个类代表了一个用户的简单模型,包含了用户名和密码两个属性及其相应的getter和setter方法。通过这种方式,Spring可以方便地管理对象的生命周期,并实现依赖注入。 ##### 2. 数据访问接口:UserDAO.java 为了实现数据访问层与业务逻辑层的分离,Spring推荐使用DAO模式。`UserDAO.java`定义了数据访问的基本操作: ```java package com.bebig.dao; import com.bebig.model.User; public interface UserDAO { public void save(User u); } ``` 这里定义了一个`save`方法用于保存用户数据。接口的实现将负责具体的数据库操作。 ##### 3. 数据访问接口实现:UserDAOImpl.java 接下来是`UserDAO`接口的具体实现——`UserDAOImpl.java`: ```java package com.bebig.dao.impl; import com.bebig.dao.UserDAO; import com.bebig.model.User; public class UserDAOImpl implements UserDAO { @Override public void save(User u) { System.out.println("a user saved!"); } } ``` 这个实现非常简单,只输出了一条信息表示用户已被保存。在实际项目中,这里会包含数据库操作代码。 ##### 4. 业务服务类:UserService.java 业务逻辑通常封装在服务层,例如`UserService.java`: ```java package com.bebig.service; import com.bebig.dao.UserDAO; import com.bebig.model.User; public class UserService { private UserDAO userDAO; public void add(User u) { userDAO.save(u); } public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; } public UserDAO getUserDAO() { return userDAO; } } ``` 在这个类中,`UserService`通过注入`UserDAO`来完成用户数据的保存操作。依赖注入确保了服务层不需要关心数据访问的具体实现细节。 #### 三、Spring容器及Bean管理 Spring框架的核心是其IoC容器。下面介绍Spring如何管理和配置Bean。 ##### 1. Bean工厂接口:BeanFactory.java `BeanFactory`接口定义了Spring容器的基本行为: ```java package com.bebig.spring; public interface BeanFactory { public Object getBean(String name); } ``` 这个接口提供了一个`getBean`方法,用于获取容器中的Bean实例。 ##### 2. XML配置文件解析:ClassPathXmlApplicationContext.java `ClassPathXmlApplicationContext`类实现了`BeanFactory`接口,并且负责解析XML配置文件: ```java package com.bebig.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<>(); public ClassPathXmlApplicationContext() throws Exception { SAXBuilder sb = new SAXBuilder(); Document doc = sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml")).getDocument(); Element root = doc.getRootElement(); List<Element> list = root.getChildren("bean"); for (Element element : list) { String id = element.getAttributeValue("id"); String clazz = element.getAttributeValue("class"); // 创建Bean实例 Object o = Class.forName(clazz).newInstance(); beans.put(id, o); // 设置属性 List<Element> propertyElements = element.getChildren("property"); for (Element propertyElement : propertyElements) { String propertyName = propertyElement.getAttributeValue("name"); String ref = propertyElement.getAttributeValue("ref"); Object propertyValue = beans.get(ref); Method setterMethod = o.getClass().getMethod("set" + capitalize(propertyName), propertyValue.getClass()); setterMethod.invoke(o, propertyValue); } } } private String capitalize(String str) { return Character.toUpperCase(str.charAt(0)) + str.substring(1); } @Override public Object getBean(String name) { return beans.get(name); } } ``` 这段代码展示了如何解析`beans.xml`文件,并创建Bean实例。对于每一个配置的Bean,首先创建其实例,然后通过反射调用setter方法设置其属性。这里的`beans.xml`文件定义了各个Bean的配置信息,包括它们的ID、类名以及依赖关系等。 通过以上分析,我们可以看到Spring框架是如何通过配置文件解析、Bean实例化和依赖注入等机制来管理应用中的对象的。这种管理方式极大地提高了应用的灵活性和可维护性。
用户模型类User.java
package com.bebig.model;
public class User {
private String username;
private String password;
public String getPassword() {
return password;
}
public String getUsername() {
return username;
}
public void setPassword(String password) {
this.password = password;
}
public void setUsername(String username) {
this.username = username;
}
}
数据访问接口UserDAO.java
package com.bebig.dao;
//Data Access Object数据访问接口
public interface UserDAO {
public void save(User u);
}
数据访问接口的实现UserDAOImpl.java
package com.bebig.dao.impl;
import com.bebig.dao.UserDAO;
import com.bebig.model.User;
//数据访问接口的实现
public class UserDAOImpl implements UserDAO {
@Override
public void save(User u) {
System.out.println("a user saved!");
}
}
逻辑业务层UserService.java
package com.bebig.service;
import com.bebig.dao.UserDAO;
import com.bebig.model.User;
//逻辑业务层
public class UserService {
private UserDAO userDAO;
public void add(User u) {
剩余5页未读,继续阅读
- 粉丝: 1
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助