我们知道Spring最主要的就是帮我们管理Service,Dao,还有Action。
今天我们就来模拟一下Spring实现的原理,其实就是解析xml和反射机制。
以用户添加为例,直接上代码:
1.User.java
public class User { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
2.UserDAO.java
import com.yuwl.model.User; public interface UserDAO { public void save(User user); }
3.UserDAOImpl.java
import com.yuwl.dao.UserDAO; import com.yuwl.model.User; public class UserDAOImpl implements UserDAO { public void save(User user) { //Hibernate or Jdbc add System.out.println("user saved!"); } }
4.
package com.yuwl.service; import com.yuwl.dao.UserDAO; import com.yuwl.model.User; public class UserService { private UserDAO userDAO; public void add(User user) { userDAO.save(user); } public UserDAO getUserDAO() { return userDAO; } public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; } }
5.仿Spring配置文件beans.xml
<beans> <bean id="u" class="com.yuwl.dao.impl.UserDAOImpl" /> <bean id="userService" class="com.yuwl.service.UserService" > <property name="userDAO" bean="u"/> </bean> </beans>
6.仿Spring的BeanFactory.java
package com.yuwl.spring; public interface BeanFactory { public Object getBean(String id); }
7.仿Spring的ClassPathXmlApplicationContext.java
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<String, Object>(); public ClassPathXmlApplicationContext() throws Exception { //jdom解析xml SAXBuilder sb=new SAXBuilder(); Document doc=sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml")); Element root=doc.getRootElement(); List list=root.getChildren("bean"); 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(); 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); } }
8.测试
import org.junit.Test; import com.yuwl.model.User; import com.yuwl.spring.BeanFactory; import com.yuwl.spring.ClassPathXmlApplicationContext; public class UserServiceTest { @Test public void testAdd() throws Exception { BeanFactory applicationContext = new ClassPathXmlApplicationContext(); UserService service = (UserService)applicationContext.getBean("userService"); User u = new User(); u.setUsername("yuwl"); u.setPassword("123456"); service.add(u); } }
执行成功:
user saved!
接下来,将深入Spring的IOC学习。
相关推荐
内容为模拟spring实现包扫描器功能。扫描指定包下面的类
模拟实现__Spring的Ioc 1、Spring主要两个作用:实例化Bean,动态装配Bean。并将所有的bean放到spring容器中,调用时从容器中取。Spring容器就是一个bean的Map:private Map, Object> beans = new HashMap, Object>...
以注解方式模拟Spring IoC AOP,了解Spring是如何实现的.
模拟Spring中IOC、AOP的实现过程
NULL 博文链接:https://lgd-java2eye.iteye.com/blog/759878
模拟spring框架的ioc功能,简单实用的实现,高效。
基于java简单模拟实现spring_ioc
模拟Spring IOC 自己实现依赖注入 自己的Spring 自己的代码模拟spring的依赖注入 自己写的 绝对独一无二
自己实现的简易的模拟Spring的IoC容器,实现注解自动装配
/*模拟spring的实现 * 1.通过构造器获取配置文件 * 2.通过dom4j解析配置文件,得到list集合(存放Bean标签的id和class属性) * 3.通过反射实例化得到对应的实例化对象,放置在map中(map是键值对,可根据id获取值)...
实现spring底层原理。 例如spring是如何创建bean的等等。
SpringIOC和AOP实现机制模拟,来自与网络。
NULL 博文链接:https://gaojiewyh.iteye.com/blog/409606
java 动态代理实现,模拟了spring实现aop的原理,对学习面向切面编程的朋友有帮助!
用Java语言的实现的模拟sping的程序
以注解方式模拟Spring_IoC,AOP,看完后可以加深理解Spring的实现.
模拟实现spring IOC AOP的例子,如果你是eclipse开发工具,解压直接导入就可以,别忘了,导入dom4j的jar包。
通过SpringCloud组件,搭建Eureka服务注册中心,实现了服务注册中心,服务提供者,服务消费者,以及模拟了简单的服务治理机制
通过模拟SpringAOP,设置四个Advice实现简单的切面编程