课程咨询: 400-996-5531 / 投诉建议: 400-111-8989

认识达内从这里开始

认真做教育 专心促就业

轻松了解Spring中的控制反转和依赖注入(二)

这篇文章我们模拟一下SpringIOC的工作机制,使我们更加深刻的理解其中的工作。在上代码之前我们先来看看几个类的设计目的。

BeanFactor接口:在Spring源码中的定义是:持有对一定数量的Bean的定义,同时每个Bean都被唯一标识的对象(类),需要实现这个接口。根据对Bean的定义,该工厂将会返回一个包含Bean定义的对象的独立实例(原型设计模式),或者单例共享(一个不错的单例设计模式,)范围是整个工厂的范围(也可以理解成是整个容器下),返回哪种类型的实例依赖于Bean工厂的配置:API是相同的。因为Spring2.0中扩大了依赖范围,可以根据具体应用上下问(如在Web环境中的请求和会话),BeanFactory是应用程序组件的中央注册中心和集中配置。简单的来说该接口定义了获取Bean的方法,由子类去实现。

BeanFactory接口:是实现BeanFactory接口的抽象基类。实现获取Bean定义的方法。

XmlContext类:继承了AbstractBeanFactory抽象类,进行Bean的注册和注册XML的读取器。

BeanInfo类:进行存储Bean的信息。

接下来上代码,需要注释的地方我都添加上去了,类的目录如下。

类之间的结构

以下是代码

packageioc.factory;/*** Created by zzf on 2016/10/26.*/publicinterfaceBeanFactory {/***根据对象的ID标识获取对象实例*@paramname *@return*/Object getBean(String name); }

#;importjava.lang.Object;importjava.util.HashMap;importjava.util.Map;/*** Created by zzf on 2016/10/26.*/publicclassBeanInfo {privateString id;privateString type;privateMap<String,Object> properties=newHashMap<String,Object>();publicString getId() {returnid; }publicvoidsetId(String id) {this.id =id; }publicString getType() {returntype; }publicvoidsetType(String type) {this.type =type; }publicMap<String, Object>getProperties() {returnproperties; }publicvoidsetProperties(Map<String, Object>properties) {this.properties =properties; }publicvoidaddProperty(String name, Object object) {this.properties.put(name, object); } }

packageioc.bean;/*** Created by zzf on 2016/10/26.*/publicclassPerson {privateString username;privateString password;publicString getUsername() {returnusername; }publicvoidsetUsername(String username) {this.username =username; }publicString getPassword() {returnpassword; }publicvoidsetPassword(String password) {this.password =password; } }

packageioc.factory;importioc.info.BeanInfo;importioc.reader.SourceReader;importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;importjava.util.Map;/*** Created by zzf on 2016/10/26. * *最顶层的IOC实现*该类负责从注册器中取出注册对象*实现从对象描述信息转换为对象实例的过程*实现根据名称获取对象的方法**/publicabstractclassAbstractBeanFactoryimplementsBeanFactory {privateString filePath;privateMap<String,BeanInfo>container;protectedSourceReader reader;publicAbstractBeanFactory(String filePath){this.filePath=filePath; setReader(reader); }/***由子类决定如果使用什么样的注册读取器*这里使用了模板方法,父类定义抽象方法,但交给子类自由去设计方法内容*@paramreader*/protectedabstractvoidsetReader(SourceReader reader);//注册beanpublicvoidregisterBeans(){this.container=this.reader.loadBeans(filePath); } @OverridepublicObject getBean(String name) { BeanInfo beanInfo=this.container.get(name);if(beanInfo==null){returnnull; }else{returnthis.parseBean(beanInfo); } }/***解析生成并生成对象实例*主要通过反射完成*根据类名,加载指定类,并取得该类的Class对象*使用Class对象实例化该类,获取一个对象。*逐个设置对象字段的值,这里采用setter Method方式* *@parambeanInfo指定对象的描述信息*@return*/protectedObject parseBean(BeanInfo beanInfo){ Class clazz;try{//加载Bean的实例clazz=Class.forName(beanInfo.getType()); Object bean=clazz.newInstance();//获取该对象下的所有方法,包括私有Method[] methods=clazz.getDeclaredMethods();for(String property:beanInfo.getProperties().keySet()){ String setter="set"+firstCharToUp(property);for(Method method:methods){ String methodName=method.getName();if(methodName.equals(setter)){ Object value=beanInfo.getProperties().get(property);//使用反射调用set方法method.invoke(bean,value); } } }returnbean; }catch(ClassNotFoundException e) { e.printStackTrace(); }catch(InstantiationException e) { e.printStackTrace(); }catch(IllegalAccessException e) { e.printStackTrace(); }catch(InvocationTargetException e) { e.printStackTrace(); }returnnull; }privateString firstCharToUp(String property) { System.out.println(property);char[] c=property.toCharArray(); String first=String.valueOf(c[0]).toUpperCase(); c[0]=first.charAt(0); System.out.println(String.valueOf(c));returnString.valueOf(c); } }packageioc.context;importioc.factory.AbstractBeanFactory;importioc.reader.SourceReader;importioc.reader.XMLSourceReader;/*** Created by zzf on 2016/10/26. *上下文的构造方法*该方法中指明注册读取器(这里采用的XML,读者可以根据兴趣去实现另外的方式如注解)*并在构造该方法时一次性加载注册的对象*/publicclassXMLContextextendsAbstractBeanFactory{publicXMLContext(String filePath){super(filePath);this.setReader(newXMLSourceReader());super.registerBeans(); } @OverrideprotectedvoidsetReader(SourceReader reader) {super.reader=reader; } }

packageioc.reader;importioc.info.BeanInfo;importjava.util.Map;/*** Created by zzf on 2016/10/26. *注册读取器接口*负责读取用户注册的对象*继承该接口的类可以实现多种读取方式,如从配置文件中读取,根据标注读取,从网络中读取等等*/publicinterfaceSourceReader { Map<String,BeanInfo>loadBeans(String filePath); }

packageioc.context;importioc.factory.AbstractBeanFactory;importioc.reader.SourceReader;importioc.reader.XMLSourceReader;/*** Created by zzf on 2016/10/26. *上下文的构造方法*该方法中指明注册读取器(这里采用的XML,读者可以根据兴趣去实现另外的方式如注解)*并在构造该方法时一次性加载注册的对象*/publicclassXMLContextextendsAbstractBeanFactory{publicXMLContext(String filePath){super(filePath);this.setReader(newXMLSourceReader());super.registerBeans(); } @OverrideprotectedvoidsetReader(SourceReader reader) {super.reader=reader; } }

packageioc.reader;importioc.info.BeanInfo;importorg.dom4j.Attribute;importorg.dom4j.Document;importorg.dom4j.DocumentException;importorg.dom4j.Element;importorg.dom4j.io.SAXReader;importjava.beans.IntrospectionException;importjava.beans.Introspector;importjava.beans.PropertyDescriptor;importjava.io.InputStream;importjava.io.Reader;importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;importjava.util.HashMap;importjava.util.Iterator;importjava.util.Map;/*** Created by zzf on 2016/10/26. *使用dom4j进行Xml的读取操作*/publicclassXMLSourceReaderimplementsSourceReader { @OverridepublicMap<String, BeanInfo>loadBeans(String filePath) {//读取指定的配置文件SAXReader reader =newSAXReader(); ClassLoader classLoader=Thread.currentThread().getContextClassLoader();//从class目录下获取指定的xml文件InputStream ins =classLoader.getResourceAsStream(filePath); Document doc=null;try{ doc=reader.read(ins); }catch(DocumentException e) { e.printStackTrace(); }//获得根节点Element root =doc.getRootElement(); Map<String,BeanInfo>beanInfoMap=newHashMap<String, BeanInfo>();//遍历beanfor(Iterator i = root.elementIterator("bean"); i.hasNext();){ Element element=(Element) i.next();//获取bean的属性id和classAttribute id = element.attribute("id"); Attribute cls= element.attribute("class");try{//利用Java反射机制,通过class的名称获取Class对象Class bean=Class.forName(cls.getText());//获取对应class的信息java.beans.BeanInfo info=Introspector.getBeanInfo(bean);//获取其属性描述PropertyDescriptor [] propertyDescriptors=info.getPropertyDescriptors(); Method method; Object object=bean.newInstance(); BeanInfo beanInfo=newBeanInfo();for(Iterator iterator=element.elementIterator("property");iterator.hasNext();){ Element foo2=(Element) iterator.next();//获取该property的name属性Attribute ame = foo2.attribute("name"); String value=null;//获取该property的子元素value的值for(Iterator ite1 = foo2.elementIterator("value"); ite1.hasNext();) { Element ode=(Element) ite1.next(); value=node.getText();break; } System.out.println("name:"+name.getText()+"value"+value);for(intj=0;j<propertyDescriptors.length;j++){if(propertyDescriptors[j].getName().equalsIgnoreCase(name.getText())){ method=propertyDescriptors[j].getWriteMethod();//利用Java的反射极致调用对象的某个set方法,并将值设置进去method.invoke(object,value);//将获取的对象属性信息存入我们自定义的BeanInfo当中beanInfo.addProperty(name.getText(),value); } } beanInfo.setId(id.getText()); beanInfo.setType(cls.getText()); beanInfoMap.put(id.getText(),beanInfo); }returnbeanInfoMap; }catch(ClassNotFoundException e) { e.printStackTrace(); }catch(IntrospectionException e) { e.printStackTrace(); }catch(InstantiationException e) { e.printStackTrace(); }catch(IllegalAccessException e) { e.printStackTrace(); }catch(InvocationTargetException e) { e.printStackTrace(); } }returnnull; } }

<?xml version="1.0" encoding="UTF-8"?><beans><beanid="person"class="ioc.bean.Person"><propertyname="username"><value>zzf</value></property><propertyname="password"><value>12345678</value></property></bean></beans>

packageioc;importioc.bean.Person;importioc.context.XMLContext;importioc.factory.BeanFactory;/*** Created by zzf on 2016/10/26.*/publicclasstest {publicstaticvoidmain(String[] args) { BeanFactory factory=newXMLContext("configuration/config.xml"); Person person= (Person) factory.getBean("person"); System.out.println(person.getPassword()); System.out.println(person.getUsername()); } }

<  上一篇:你选择哪一种方式创建线程?
下一篇:Spring注入JPA+JPA事务管理  >
相关推荐
最新资讯
免费试听课程
  • 全部课程
  • IT课程
  • 设计课程
  • 运营课程
Free courses
最新开班时间
  • 北京
  • 上海
  • 广州
  • 深圳
  • 南京
  • 成都
  • 武汉
  • 西安
  • 青岛
  • 天津
  • 杭州
  • 重庆
  • 哈尔滨
  • 济南
  • 沈阳
  • 合肥
  • 郑州
  • 长春
  • 苏州
  • 长沙
  • 昆明
  • 太原
  • 无锡
  • 石家庄
  • 南宁
  • 佛山
  • 珠海
  • 宁波
  • 保定
  • 呼和浩特
  • 洛阳
  • 烟台
  • 运城
  • 潍坊
  • 开课名称
  • 开班时间
  • 抢座
  • 咨询
  • 开课名称
  • 开班时间
  • 抢座
  • 咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 云计算全栈开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 人工智能工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 数据分析与商业智能
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AGI商业设计变现
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 新媒体电商运营
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 云计算全栈开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 云计算全栈开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 云计算全栈开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AGI商业设计变现
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 新媒体电商运营
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 云计算全栈开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AGI商业设计变现
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 新媒体电商运营
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 云计算全栈开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 云计算全栈开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 数据分析与商业智能
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AGI商业设计变现
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 新媒体电商运营
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 新媒体电商运营
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AGI商业设计变现
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 云计算全栈开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AGI商业设计变现
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 新媒体电商运营
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 云计算全栈开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 新媒体电商运营
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AGI商业设计变现
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AGI商业设计变现
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 云计算全栈开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AGI商业设计变现
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AGI商业设计变现
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AGI商业设计变现
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
预约申请试听课
收起