spring模拟ioc
- 非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的更多相关文章
- [原]容器学习(一):动手模拟spring的IoC
介绍 学习经典框架的实现原理以及设计模式在其实际中的运用,是非常有必要的,可以让我们更好进行面向对象. 本篇文章就来模拟Spring的IOC功能,明白原理后,可以更好的使用它,进而为进行面向对象提供一 ...
- 容器学习(一):动手模拟spring的IoC
介绍 学习经典框架的实现原理以及设计模式在事实上际中的运用,是很有必要的,能够让我们更好进行面向对象. 本篇文章就来模拟Spring的IOC功能.明确原理后,能够更好的使用它,进而为进行面向对象提供一 ...
- Spring——原理解析-利用反射和注解模拟IoC的自动装配
解析Spring的IoC容器基于注解实现的自动装配(自动注入依赖)的原理 1.本文案例 使用注解和反射机制来模拟Spring中IoC的自动装配功能 定义两个注解:@Component,用来标注组件:@ ...
- JAVA模拟Spring实现IoC过程(附源码)
前言:本人大四学生,第一次写博客,如果有写得不好的地方,请大家多多指正 一.IoC(Inversion of Control)反转控制 传统开发都是需要对象就new,但这样做有几个问题: 效率低下,创 ...
- 自己动手模拟spring的IOC
我们这里是模拟spring,主要模拟spring中的IOC功能,所以在此我们一样要在service层中定义dao的实例,当然不用new出来,我们就通过spring的IOC把这里的dao层注入进来.不要 ...
- Spring的Ioc模拟实现
关于IOC:我们讲个故事吧! 有一个厨师,他在做一道菜的时候需要某种调味料(bean),可是他正好没有那瓶调味料(bean),这个时候他就必须去制作一瓶调味料(bean)出来.(这就像我们平时需要 ...
- spring容器IOC创建对象<三>
问题?Spring的DI讲解.DI有几种注入方式.一.spring的DI:依赖注入给属性赋值DI定义:一个对象类的属性可以使用springDI(依赖注入)来进行赋值,但是并不是所有的类属性都适合spr ...
- Spring中IOC和AOP的详细解释
我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式. IOC就是典型的工厂模式,通过s ...
- Spring 实践 -IoC
Spring 实践 标签: Java与设计模式 Spring简介 Spring是分层的JavaSE/EE Full-Stack轻量级开源框架.以IoC(Inverse of Control 控制反转) ...
随机推荐
- vue-9-动画
transition: <div id="demo"> <button v-on:click="show = !show"> Toggl ...
- sass 继承 占位符 %placeholder
@extend //SCSS .btn { border: 1px solid #ccc; padding: 6px 10px; font-size: 14px; } .btn-primary { b ...
- python中各种遇到的函数
函数:split() Python中有split()和os.path.split()两个函数,具体作用如下:split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(lis ...
- Android : 跟我学Binder --- (1) 什么是Binder IPC?为何要使用Binder机制?
目录: Android : 跟我学Binder --- (1) 什么是Binder IPC?为何要使用Binder机制? Android : 跟我学Binder --- (2) AIDL分析及手动实现 ...
- jquery 将一组元素转换成数组
HTML 代码: <p><b>Values: </b></p> <form> <input type="text" ...
- DevExpress WinForms使用教程:WinForms Fluent Design和Acrylic Effects
在先前的版本发布中,宣布支持Fluent Design Form和Acrylic effects——旨在复制Microsoft下一代UI metaphor的新功能.本文主要介绍如何实现此功能,并明确说 ...
- Centos7部署kubernetes API服务(四)
1.准备软件包 [root@linux-node1 bin]# pwd /usr/local/src/kubernetes/server/bin [root@linux-node1 bin]# cp ...
- Oracle备份归档日志文件的两种方法比较
备份归档日志方式有两种: 1 单独备份归档日志:backup archivelog all 2 在执行备库时一起备份归档日志:backup database plus archivelog; 这 ...
- shell脚本实例-while实现批量创建用户
#!/usr/bin/bash while read line #读取一行结果 do if [ ${#line} -eq 0 ];then #如果有空行的话就跳过这次循环 contiune fi us ...
- ios表单验证帮助类
// // ValidateHelper.h // #import <Foundation/Foundation.h> @interface ValidateHelper : NSObje ...