Spring学习--面向抽象编程(模拟Spring的简单实现)

}

下面就是叫你如何面向抽象编程,简单来说如何面向接口编程,下面定义一个接口

package com.wwj.dao;

import com.wwj.model.User;

/**

  • 面向抽象编程

  • @author wwj

  • 优点:增加了灵活性

*/

public interface UserDAO {

public void save(User user);

}

可以很清楚看到,这个接口声明了一个方法,save方法,里面有一个参数User对象,我们可以想到它是可以用来保存User对象到数据库里去的。

把具体实现交给实现类

package com.wwj.dao.impl;

import com.wwj.dao.UserDAO;

import com.wwj.model.User;

/**

  • 接口实现类

  • @author wwj

*/

public class UserDAOImpl implements UserDAO{

@Override

public void save(User user) {

System.out.println(“save user”);

}

}

这样做的好处是,如果你要更换数据库环境,你就能灵活定义不同的数据库代码了。

怎么调用以上的方法,为了使业务逻辑和数据库操作分离开,我们需要定义一个业务逻辑类

package com.wwj.service;

import com.wwj.dao.UserDAO;

import com.wwj.dao.impl.UserDAOImpl;

import com.wwj.model.User;

/**

  • 服务类,实现业务逻辑

  • @author wwj

*/

public class UserService {

private UserDAO userDAO;

public UserDAO getUserDAO() {

return userDAO;

}

public void setUserDAO(UserDAO userDAO) {

this.userDAO = userDAO;

}

public void add(User user) {

this.userDAO.save(user);

}

}

我们可以看到,上面有一个东西,东西?UserDAO啊,看到它的作用了没有,看到才怪。这里设计到一个IOC也叫做DI的概念,中文意思叫做依赖注入,也叫控制反转,这在Spring是一个很重要的概念,要把它弄懂,才能很好的理解Spring的原理。

下面真正模拟Spring的实现,有点像工厂模式,利用Spring,我们可以把不同对象装配在一起使用。

先看一下配置文件beans.xml

一个工厂方法

package com.wwj.spring;

public interface BeanFactory {

public Object getBean(String name);

}

一个解析xml文件的类,并实现BeanFactory

package com.wwj.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;

/**

  • 2013/6/7

  • @author wwj

  • 模拟Spring

*/

public class ClassPathXmlApplicationContext implements BeanFactory{

//定义一个容器,用来存放对象

private Map<String,Object> beans = new HashMap<String, Object>();

public ClassPathXmlApplicationContext() throws Exception{

SAXBuilder sb = new SAXBuilder();

Document doc = sb.build(this.getClass().getClassLoader().getResourceAsStream(“beans.xml”));

Element root = doc.getRootElement(); //获取根结点

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”); //取id值

String cla = element.getAttributeValue(“class”); //取class值

Object o = Class.forName(cla).newInstance();

System.out.println(id);

System.out.println(cla);

beans.put(id,o);

for(Element propertyElement : (List)element.getChildren(“property”)){

String name = propertyElement.getAttributeValue(“name”); //UserDAO

String bean = propertyElement.getAttributeValue(“bean”); //u

Object beanObject = beans.get(bean);//UserDAOImpl instance

//拼凑方法名,实现setUserDAO方法

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); //调用方法

}

}

}

@Override

public Object getBean(String name) {

return beans.get(“id”);

}

}

package com.wwj.service;

import org.junit.Test;

import com.wwj.model.User;

import com.wwj.spring.BeanFactory;

import com.wwj.spring.ClassPathXmlApplicationContext;

感受:

其实我投简历的时候,都不太敢投递阿里。因为在阿里一面前已经过了字节的三次面试,投阿里的简历一直没被捞,所以以为简历就挂了。

特别感谢一面的面试官捞了我,给了我机会,同时也认可我的努力和态度。对比我的面经和其他大佬的面经,自己真的是运气好。别人8成实力,我可能8成运气。所以对我而言,我要继续加倍努力,弥补自己技术上的不足,以及与科班大佬们基础上的差距。希望自己能继续保持学习的热情,继续努力走下去。

也祝愿各位同学,都能找到自己心动的offer。

分享我在这次面试前所做的准备(刷题复习资料以及一些大佬们的学习笔记和学习路线),都已经整理成了电子文档

拿到字节跳动offer后,简历被阿里捞了起来,二面迎来了P9"盘问"

ort com.wwj.spring.ClassPathXmlApplicationContext;

感受:

其实我投简历的时候,都不太敢投递阿里。因为在阿里一面前已经过了字节的三次面试,投阿里的简历一直没被捞,所以以为简历就挂了。

特别感谢一面的面试官捞了我,给了我机会,同时也认可我的努力和态度。对比我的面经和其他大佬的面经,自己真的是运气好。别人8成实力,我可能8成运气。所以对我而言,我要继续加倍努力,弥补自己技术上的不足,以及与科班大佬们基础上的差距。希望自己能继续保持学习的热情,继续努力走下去。

也祝愿各位同学,都能找到自己心动的offer。

分享我在这次面试前所做的准备(刷题复习资料以及一些大佬们的学习笔记和学习路线),都已经整理成了电子文档

[外链图片转存中…(img-Y3ffd8sH-1721157971746)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值