模拟一个简单的spring(依赖注入)
来源:互联网 发布:复杂网络 小世界 编辑:程序博客网 时间:2024/06/06 17:52
一 模拟一个spring(依赖注入)
UserDAO.java============用于访问数据库的抽象,是一个接口
public interface UserDAO {
public void save(User u);
}
UserDAOImpl.java=======这个是它的具体实现(设计成接口有利于实现多种数据的访问1)
public class UserDAOImpl implements UserDAO{
@Override
public void save(User u) {
System.out.println("a user save");
}
}
UserService.java=========这个是用来调用dao的服务
public class UserService {
private UserDAO userDAO;
public void add(User u){
this.userDAO.save(u);
}
public UserDAO getUserDAO() {
return userDAO;
}
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
}
UserServiceTest.java===这个是JUnit test
//使用JUnit 就直接在对应的类,右键选择JUnit test 然后选择要test的方法完成就可以用了
public class UserServiceTest {
public void testAdd() throws Exception {
/*本来我们是这样做的*/
/*
UserService service = new UserService();
UserDAO userDAO = new UserDAOImpl();
service.userDAO = userDAO;
User u = new User();
service.add(u);
*/
/*使用spring后,我们就可以直接用工厂创建对应的实例,很明显这样更有利于各组件的解耦*/
BeanFactory factory = new ClassPathXmlApplicationContext();
UserService service = (UserService)factory.getBean("userService");
User u = new User();
service.add(u);
}
}
BeanFactory.java=================bean工厂,必须实现这个借口
public interface BeanFactory {
public Object getBean(String name);
}
ClassPathXmlApplicationContext.java====通过反射机制来实例bean
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");//取名字为disk的所有元素
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);
}
}
bean.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>
UserDAO.java============用于访问数据库的抽象,是一个接口
public interface UserDAO {
public void save(User u);
}
UserDAOImpl.java=======这个是它的具体实现(设计成接口有利于实现多种数据的访问1)
public class UserDAOImpl implements UserDAO{
@Override
public void save(User u) {
System.out.println("a user save");
}
}
UserService.java=========这个是用来调用dao的服务
public class UserService {
private UserDAO userDAO;
public void add(User u){
this.userDAO.save(u);
}
public UserDAO getUserDAO() {
return userDAO;
}
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
}
UserServiceTest.java===这个是JUnit test
//使用JUnit 就直接在对应的类,右键选择JUnit test 然后选择要test的方法完成就可以用了
public class UserServiceTest {
public void testAdd() throws Exception {
/*本来我们是这样做的*/
/*
UserService service = new UserService();
UserDAO userDAO = new UserDAOImpl();
service.userDAO = userDAO;
User u = new User();
service.add(u);
*/
/*使用spring后,我们就可以直接用工厂创建对应的实例,很明显这样更有利于各组件的解耦*/
BeanFactory factory = new ClassPathXmlApplicationContext();
UserService service = (UserService)factory.getBean("userService");
User u = new User();
service.add(u);
}
}
BeanFactory.java=================bean工厂,必须实现这个借口
public interface BeanFactory {
public Object getBean(String name);
}
ClassPathXmlApplicationContext.java====通过反射机制来实例bean
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");//取名字为disk的所有元素
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);
}
}
bean.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>
1 0
- 模拟一个简单的spring(依赖注入)
- java简单模拟Spring的依赖注入
- spring依赖注入原理的简单模拟
- 简单的模拟依赖注入
- 利用反射简单模拟Spring的控制反转(Ioc)和依赖注入(DI)
- Spring框架依赖注入的一个简单应用
- 模拟spring的依赖注入原理
- spring DI 实现的模拟,依赖注入
- Spring依赖注入的简单示例(基于注解配置)
- Spring学习笔记(5)----依赖注入的简单实现
- Spring学习笔记(5)----依赖注入的简单实现
- 简单的Spring依赖注入例子~~
- 简单的Spring依赖注入例子~~
- Spring简单的依赖注入例子
- 简单的Spring依赖注入例子~~
- 模拟spring注入依赖对象
- 关于spring依赖注入的一个知识点
- 模拟spring依赖注入,自定义注入类
- wxWidgets+CodeBlocks 官方HelloWorld程序
- 顺序表和单链表
- nginx main流程分析
- CSS介绍
- 17.3数组的排序,指针
- 模拟一个简单的spring(依赖注入)
- AsyncTask
- 卡特兰数(Catalan)应用:输出所有N对合法括号序列和输出所有已知进栈序列的合法出栈序列
- html中的button和submit
- Linux下mysql库函数的使用
- 因式分解实现协同过滤-及源码实现
- 三年级英语上册复习资料(新版陕旅版)
- Oracle索引碎片分析、空间重用和整理
- 提升你网站水平的 jQuery 插件推荐