• 非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. Ie11 的改变

    摘录地址:     http://www.4fang.net/content.jsp?id=30537 微软在上周刚刚发布了用于Windows 8.1上的首个Internet Explorer 11的 ...

  2. Oracle数据库备份策略:全备与增量备份

    一.RMAN全备份 在数据量比较小.或者数据库服务器性能很强大的情况下,可以每天进行一次全备份. 全被策略如下 1.crontab定时任务,避开业务繁忙时段 ##################### ...

  3. TNetHTTPClient 使用

    unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...

  4. 使用RxSwift 实现登录页面的条件绑定

    我们在使用MVC建构进行开发时,对登录页面用户名密码等进行的处理一般是这样的,点击登录按钮判断用户框以及密码框输入的合法性,用一堆if真是屎一般!或者用textfield的代理来进行响应其实也是屎一般 ...

  5. import 语句

    声明package的语句必须在java类的有效代码第一行,所import语句要放在package 声明语句之后. import的语法格式为:    import+空格+类全限定名+: 该语句的作用是, ...

  6. c语言中printf("%x",-1);为什么会输出-1的十六进制补码??

    计算机存储的时候是以补码的形式存进去的,输出来在以你原码的形式输出(这个形式就是你设置的形式)! 比如: -1 (32位模式) 存: 1 000000000000000000000000000000 ...

  7. 几大principal

    1.A class should have only one reason to change. 一个类只负责一件事 2.高层抽象不依赖低层实现

  8. python字符串转换成数字

    Action(){ int i; char *s="{str}"; i=atoi(lr_eval_string(s)); lr_output_message("%d&qu ...

  9. <HBase><Scan>

    Overview The Scan operation for HBase. Scan API All operations are identical to Get with the excepti ...

  10. oracle 12c中种子数据库的隐藏与保护

    Oracle 12c种子数据库(pdbseed)的状态是read only,这是因为Oracle对种子数据库进行了保护,避免遭到破坏.保护好种子数据库的目的,是为了以此为模板,新建pdb数据库. 新的 ...