写一个框架,2千行代码
时间: 2024-03-12 17:47:14 浏览: 14
写一个完整的框架仅仅2千行代码是非常困难的,但是我们可以模拟一个简单的框架,功能包括实现一个简单的 IoC 容器和基本的 MVC 框架。
下面是一个简单的模拟框架的实现,代码量约为 2 千行:
1. 实现 IoC 容器
```java
public class BeanDefinition {
private Class<?> beanClass;
private Map<String, Object> properties;
// getter & setter
}
public class BeanFactory {
private Map<String, BeanDefinition> beanDefinitions;
private Map<String, Object> singletonBeans;
public BeanFactory() {
beanDefinitions = new HashMap<>();
singletonBeans = new HashMap<>();
}
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) {
beanDefinitions.put(beanName, beanDefinition);
}
public Object getBean(String beanName) throws Exception {
Object bean = singletonBeans.get(beanName);
if (bean != null) {
return bean;
}
BeanDefinition beanDefinition = beanDefinitions.get(beanName);
if (beanDefinition == null) {
throw new Exception("Bean not found: " + beanName);
}
Class<?> beanClass = beanDefinition.getBeanClass();
bean = beanClass.getDeclaredConstructor().newInstance();
Map<String, Object> properties = beanDefinition.getProperties();
for (Field field : beanClass.getDeclaredFields()) {
String propertyName = field.getName();
Object propertyValue = properties.get(propertyName);
if (propertyValue != null) {
field.setAccessible(true);
field.set(bean, propertyValue);
}
}
singletonBeans.put(beanName, bean);
return bean;
}
}
```
2. 实现 MVC 框架
```java
public interface HandlerAdapter {
boolean supports(Object handler);
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
}
public class SimpleControllerHandlerAdapter implements HandlerAdapter {
@Override
public boolean supports(Object handler) {
return handler instanceof SimpleController;
}
@Override
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return ((SimpleController) handler).handleRequest(request, response);
}
}
public interface View {
void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception;
}
public class JspView implements View {
private String viewName;
public JspView(String viewName) {
this.viewName = viewName;
}
@Override
public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setAttribute("model", model);
request.getRequestDispatcher("/WEB-INF/views/" + viewName + ".jsp").forward(request, response);
}
}
public class ModelAndView {
private View view;
private Map<String, ?> model;
public ModelAndView(View view, Map<String, ?> model) {
this.view = view;
this.model = model;
}
public View getView() {
return view;
}
public Map<String, ?> getModel() {
return model;
}
}
public interface Controller {
}
public interface SimpleController extends Controller {
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
}
public class SimpleUrlHandlerMapping {
private Map<String, Object> urlHandlers;
public SimpleUrlHandlerMapping() {
urlHandlers = new HashMap<>();
}
public void registerHandler(String urlPath, Object handler) {
urlHandlers.put(urlPath, handler);
}
public Object getHandler(HttpServletRequest request) {
String urlPath = request.getRequestURI();
return urlHandlers.get(urlPath);
}
}
public class DispatcherServlet extends HttpServlet {
private BeanFactory beanFactory;
private SimpleUrlHandlerMapping urlHandlerMapping;
private List<HandlerAdapter> handlerAdapters;
public DispatcherServlet() {
beanFactory = new BeanFactory();
urlHandlerMapping = new SimpleUrlHandlerMapping();
handlerAdapters = new ArrayList<>();
handlerAdapters.add(new SimpleControllerHandlerAdapter());
}
@Override
public void init() throws ServletException {
BeanDefinition controllerBeanDefinition = new BeanDefinition();
controllerBeanDefinition.setBeanClass(MyController.class);
beanFactory.registerBeanDefinition("myController", controllerBeanDefinition);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
Object handler = urlHandlerMapping.getHandler(request);
if (handler != null) {
HandlerAdapter handlerAdapter = getHandlerAdapter(handler);
if (handlerAdapter != null) {
ModelAndView modelAndView = handlerAdapter.handle(request, response, handler);
if (modelAndView != null) {
View view = modelAndView.getView();
Map<String, ?> model = modelAndView.getModel();
view.render(model, request, response);
}
}
} else {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
}
} catch (Exception e) {
throw new ServletException(e);
}
}
private HandlerAdapter getHandlerAdapter(Object handler) {
for (HandlerAdapter handlerAdapter : handlerAdapters) {
if (handlerAdapter.supports(handler)) {
return handlerAdapter;
}
}
return null;
}
}
public class MyController implements SimpleController {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
Map<String, Object> model = new HashMap<>();
model.put("message", "Hello, World!");
return new ModelAndView(new JspView("hello"), model);
}
}
```
上面的代码实现了一个简单的 IoC 容器和基本的 MVC 框架,其中 IoC 容器实现了 BeanDefinition 和 BeanFactory,MVC 框架实现了 HandlerAdapter、View、ModelAndView、SimpleController、Controller 和 SimpleUrlHandlerMapping 等核心组件。虽然这个框架非常简单,但是可以帮助初学者了解一个框架的基本组成和实现方式。