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 控制反转) ...
随机推荐
- Win10系列:JavaScript 数据绑定
使用数据绑定可以使页面中元素的属性值与数据源中的数据同步,其中数据源可以来自数据库.文件以及自定义的数据等.在常用的数据绑定方法中,简单对象绑定是将HTML元素与一个仅包含数据的简单对象相绑定,模板绑 ...
- 尚学堂java 答案解析 第四章
本答案为本人个人编辑,仅供参考,如果读者发现,请私信本人或在下方评论,提醒本人修改 一.选择题 1.BD 解析:B:类必须有构造方法,若程序未写,这系统自动调用系统构造方法. D:super()会调用 ...
- 深入理解 Java 虚拟机——走近 Java
1.1 - 概述 Java 总述:Java 不仅是一门编程语言,还是一个由一系列 计算机软件 和 规范 形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于 嵌入式 ...
- global 全局变量 nonlocal 局部变量
# x= # def func(): # x= # # func() # print(x) # x=[] # def func(): # x.append() # x.append() # x.app ...
- sqlalchemy 模型中添加根据身份证号计算性别和年龄
class Users(Base, BaseMixin): username = Column(String(24)) id_Num = Column(String(18) ) # 身份证号码 @pr ...
- vue-router-7-重定向及别名
const router = new VueRouter({ mode: 'history', base: __dirname, routes: [ { path: '/', component: H ...
- 在JS文件中,不需要<script>标签
在JS文件中,不需要<script>标签\
- Capjoint
前期知识储备: 现如今的全球台站分布情况:在全球大陆的分布并不均衡.在美国加利福尼亚.日本.中国台湾等地区,台站分布密集,数字化程度高.然而在世界很多地区发生的地震,往往在300km范围内仅有2到3个 ...
- 一个灵活的AssetBundle打包工具
尼尔:机械纪元 上周介绍了Unity项目中的资源配置,今天和大家分享一个AssetBundle打包工具.相信从事Unity开发或多或少都了解过AssetBundle,但简单的接口以及众多的细碎问题 ...
- C点滴成海----函数声明、函数定义、函数原型
一.函数声明 1.格式 函数体去掉函数定义中的内容再加上分号,如下所示: 返回值类型 函数名( 类型 形参, 类型 形参… ); 返回值类型 函数名( 类型, 类型…); 2.特点 函数声明只是对编译 ...