• 非spring 开发
public class UserService {

    private UserDao userDao=new UserDaoImpl();

    public void addUser(User user){
userDao.addUser(user);
}
}
public interface UserDao {

     public void addUser(User user);
}
public class UserDaoImpl implements UserDao {

    @Override
public void addUser(User user) {
// TODO Auto-generated method stub
//保存数据 这边省略连接数据库操作代码
System.out.println("id:"+user.getId()+",name"+user.getName());
System.out.println("user save !!!");
}
}

测试代码

public class Test1 {

    private UserService userService=new UserService();
private User user; @Before
public void init(){
user=new User();
user.setId(1);
user.setName("zhangsan");
userService=new UserService();
} @Test
public void test(){
userService.addUser(user);
}
}

结果:

id---1,name---zhangsan
user save !!!
  • 模拟spring开发模式,将所有对象都放到容器中,用到的对象从容器中取
  • 所有的对象通过xml文件的形式进行配置,使用jdom读取xml文件内容

导包  读取beans.xml文件

<beans>
<!-- 配置文件形式 配置 userdao -->
<bean id="userDao" class="com.qzzx.dao.impl.UserDaoImpl"></bean>
<!-- 配置文件形式 配置userservice -->
<bean id="userService" class="com.qzzx.service.UserServiceXml">
<property name="userDao" bean="userDao"></property>
</bean>
</beans>

beans 配置文件

public class ClassPathXmlApplicationContext implements BeanFactory{

    //定义一个容器存放bean对象
Map<String, Object> map=new HashMap<>();
/**
* 初始化容器
*/
public ClassPathXmlApplicationContext() {
//使用jdom解析 beans.xml文件
SAXBuilder sb=new SAXBuilder();
try {
//获取文档对象
Document doc = sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml"));
//获取根节点
Element root = doc.getRootElement();
//获取所有bean节点
List childrenBean = root.getChildren("bean");
for (int i = 0; i < childrenBean.size(); i++) {
//遍历获取单个bean标签,并取得其中id和class属性的值
Element bean = (Element) childrenBean.get(i);
String id=bean.getAttributeValue("id");
String clazz=bean.getAttributeValue("class");
//打印查看
// System.out.println("id:"+id+",class:"+clazz);
//利用反射原理获得对象,并且实例化
Object obj = Class.forName(clazz).newInstance();
//将对象存到 容器中
map.put(id, obj); //模拟 依赖注入 遍历bean中的标签
List properties = bean.getChildren("property");
for (int j = 0; j < properties.size(); j++) {
Element p = (Element) properties.get(j);
String name = p.getAttributeValue("name");
String beanName = p.getAttributeValue("bean");
//获得注入对象
Object setObject = map.get(beanName); //采用 set方法将对象注入 clazz名》》set方法名》》method》》执行 method,注入
String methodName="set"+name.substring(0, 1).toUpperCase()+name.substring(1, name.length());
// System.out.println("methodName:"+methodName);
// System.out.println("接口名字:"+setObject.getClass().getInterfaces()[0]);
Method method = obj.getClass().getMethod(methodName, setObject.getClass().getInterfaces()[0]);
method.invoke(obj, setObject);
String GetMethodName="get"+name.substring(0, 1).toUpperCase()+name.substring(1, name.length()); // Method method2= obj.getClass().getMethod(GetMethodName);
// Object invoke = method2.invoke(obj);
// System.out.println(invoke==setObject);
}
} System.out.println("对象容器:"+map);
} catch (Exception e) {
e.printStackTrace();
}
} @Override
public Object getBean(String name) {
// TODO Auto-generated method stub
return map.get(name);
} }

bean 容器

public interface BeanFactory {

    public Object getBean(String name);

}

beanFactory

public class UserServiceXml {

    private UserDao userDao;

    public void addUser(User user){
userDao.addUser(user);
}
public UserDao getUserDao() {
return userDao;
} public void setUserDao(UserDao userDao) {
this.userDao = userDao;
} }

userServiceXml

public class UserDaoImpl implements UserDao {

    @Override
public void addUser(User user) {
// TODO Auto-generated method stub
//保存数据 这边省略连接数据库操作代码
System.out.println("id---"+user.getId()+",name---"+user.getName());
System.out.println("user save !!!");
}
}

userdao

public class Test2 {

    @Test
public void test2(){
ClassPathXmlApplicationContext ac=new ClassPathXmlApplicationContext();
UserServiceXml userServiceXml = (UserServiceXml) ac.getBean("userService");
User user=new User();
user.setId(2);
user.setName("李四");
userServiceXml.addUser(user);
} }

testSpring

对象容器:{userService=com.qzzx.service.UserServiceXml@11c836e8, userDao=com.qzzx.dao.impl.UserDaoImpl@6f8cc276}
id---2,name---李四
user save !!!

spring模拟ioc的更多相关文章

  1. [原]容器学习(一):动手模拟spring的IoC

    介绍 学习经典框架的实现原理以及设计模式在其实际中的运用,是非常有必要的,可以让我们更好进行面向对象. 本篇文章就来模拟Spring的IOC功能,明白原理后,可以更好的使用它,进而为进行面向对象提供一 ...

  2. 容器学习(一):动手模拟spring的IoC

    介绍 学习经典框架的实现原理以及设计模式在事实上际中的运用,是很有必要的,能够让我们更好进行面向对象. 本篇文章就来模拟Spring的IOC功能.明确原理后,能够更好的使用它,进而为进行面向对象提供一 ...

  3. Spring——原理解析-利用反射和注解模拟IoC的自动装配

    解析Spring的IoC容器基于注解实现的自动装配(自动注入依赖)的原理 1.本文案例 使用注解和反射机制来模拟Spring中IoC的自动装配功能 定义两个注解:@Component,用来标注组件:@ ...

  4. JAVA模拟Spring实现IoC过程(附源码)

    前言:本人大四学生,第一次写博客,如果有写得不好的地方,请大家多多指正 一.IoC(Inversion of Control)反转控制 传统开发都是需要对象就new,但这样做有几个问题: 效率低下,创 ...

  5. 自己动手模拟spring的IOC

    我们这里是模拟spring,主要模拟spring中的IOC功能,所以在此我们一样要在service层中定义dao的实例,当然不用new出来,我们就通过spring的IOC把这里的dao层注入进来.不要 ...

  6. Spring的Ioc模拟实现

      关于IOC:我们讲个故事吧! 有一个厨师,他在做一道菜的时候需要某种调味料(bean),可是他正好没有那瓶调味料(bean),这个时候他就必须去制作一瓶调味料(bean)出来.(这就像我们平时需要 ...

  7. spring容器IOC创建对象<三>

    问题?Spring的DI讲解.DI有几种注入方式.一.spring的DI:依赖注入给属性赋值DI定义:一个对象类的属性可以使用springDI(依赖注入)来进行赋值,但是并不是所有的类属性都适合spr ...

  8. Spring中IOC和AOP的详细解释

    我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式. IOC就是典型的工厂模式,通过s ...

  9. Spring 实践 -IoC

    Spring 实践 标签: Java与设计模式 Spring简介 Spring是分层的JavaSE/EE Full-Stack轻量级开源框架.以IoC(Inverse of Control 控制反转) ...

随机推荐

  1. 通过滑动条控制Cube旋转

    private float speed = 10; private float speedValue; private GameObject slider; private GameObject cu ...

  2. FFT模板(无讲解)

    #include<bits/stdc++.h> using namespace std; ; const double pi=3.1415926535898; ],len; struct ...

  3. xStream解析生成xml文件学习资料

    参考链接: http://www.cnblogs.com/hoojo/archive/2011/04/22/2025197.html

  4. JavaScript 操作DOM对象

    1)JavaScript  操作DOM對象 1.DOM:是Document  Object  Model 的缩写,及文档对象模型 2.DOM通常分为三类:DOM Core(核心).HTML-DOM 和 ...

  5. python 定义class时的内置方法

    __contains__():对类实例使用in ,not in操作时调用 class A(object): def __init__(self,num): self.num=num def __con ...

  6. js 将文本转换为数据 string number

    <span class="Span" > <p>123.81</p> <a> dejiw</a> </span&g ...

  7. Docker(3):Dockerfile介绍及简单示例

    Dockerfile 概念 Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像.它们简化了从头到尾的流程并极大的简化了部署工作.Dockerfile从FR ...

  8. Unity项目中的资源管理

    这是我在2017金山技术开放日分享的部分内容.从贴图资源格式配置的介绍开始,引申出资源配置工具,最后再谈谈一整套项目资源管理方案.在GitHub上可以获取到资源配置工具的代码,是基于下面理念的一份简单 ...

  9. 6.Python爬虫入门六之Cookie的使用

    大家好哈,上一节我们研究了一下爬虫的异常处理问题,那么接下来我们一起来看一下Cookie的使用. 为什么要使用Cookie呢? Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在 ...

  10. day 71-72 cookie 和session

    拓展知识   request---->请求信息 属性: request.path       # 获取访问文件路径 request.method属性 #获取请求中使用的HTTP方式(POST/G ...