• 非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. learning ddr mode register MR3

  2. Mysql InnoDB三大特性-- 自适应hash index

    Mysql InnoDB三大特性-- 自适应hash index

  3. PropertiesUtil 获取文件属性值

    有时候不要把一些属性值写死在代码中,而是写在配置在文件中,方便更改 PropertiesUtil工具类:读取key-value形式的配置文件,根据key获得value值  1.测试类 public c ...

  4. 重写equals() 和 hashCode()方法

    什么情况下需要重写呢? 比如去重操作时, 有时候往Set集合存放对象User,我们User类的字段太多时,比如有50个字段, 判断两个User对象相同,不需要判断它们所有字段都相同,只需要判断它们的某 ...

  5. vue-router-4-编程式导航

    想要导航到不同的 URL,用 router.push 方法,会向 history 栈添加一个新的记录 <router-link> <==>router.push // 字符串 ...

  6. angular4-http

    导入 Http 模块 import { HttpModule } from '@angular/http'; @NgModule({ imports: [BrowserModule, FormsMod ...

  7. ngnix笔记

    ngnix可通过-s 参数控制,如quit正常退出:reload重载配置文件,具体参考:http://nginx.org/en/docs/switches.html ngnix的指令解释请参考这里:h ...

  8. BOM浏览器操作对象

    BOM定义 一.定时器 1) 定时器1:setInterval() 2)一次性定时器 二.offset.scroll.client

  9. BCM5396的SPI理解

    参考文档链接:https://pan.baidu.com/s/1kuXJmULwtjOW1TeOuTRPQQ *时钟极性和相位 BCM538X / BCM5396用于根据以下标准发送/接收SPI数据: ...

  10. 【模板】AC自动机(简单版)

    我:“woc...AC自动机?” 我:“可以自动AC???” 然鹅... 大佬:“傻...” 我:“(⊙_⊙)?” 大佬:“缺...” 我:“......” (大佬...卒 | 逃...) emm.. ...