当前位置: 首页 > news >正文

双牌网站建设网站开发工程师岗位说明书

双牌网站建设,网站开发工程师岗位说明书,足球比赛直播雨燕,珠宝钻石网站建站IOC 前面体验了spring#xff0c;不过其运用了IOC#xff0c;至于IOC( Inverse Of Controll—控制反转 ) 看一下百度百科解释#xff1a; 控制反转#xff08;Inversion of Control#xff0c;缩写为IoC#xff09;#xff0c;是面向对象编程中的一种设计原则#x…IOC 前面体验了spring不过其运用了IOC至于IOC( Inverse Of Controll—控制反转 ) 看一下百度百科解释 控制反转Inversion of Control缩写为IoC是面向对象编程中的一种设计原则可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入Dependency Injection简称DI还有一种方式叫“依赖查找”Dependency Lookup。通过控制反转对象在被创建的时候由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说依赖被注入到对象中。从这个里面可以看出三个重要的词汇控制反转依赖注入。 控制既然提到控制那么就是谁控制谁也就行前提需要有两个对象不然哪里来的控制。 一般创建对象的时候通过new来创建一个对象。但是现在又有个问题了IOC既然是控制那么其如何生成对象呢既然是解耦减少new来创建对象。前面对于例子初体验的时候看出控制对象的时候没有通过new来创建对象。 反转 既然叫做反转那自然就有转了不然就没有反转一说了。当然没有正转这个词汇简单说就是一般用法就是正转。 比如一个对象控制另一个对象的时候会在这个类中创建这个被调用的对象。 class A{} class B{public static void main(String[] args) {// 所谓的正转调用 因为需要调用A的方法所以需要创建一个A的对象A anew A();} }而反转却没有看见通过new来创建对象。详情看初体验的例子 可以看出没有通过new来创建对象那么如何创建对象呢肯定是Spring帮我们创建了对象。其通过配置文件就创建了对象而这个帮忙创建对象的好人就是被称为IOC容器。而IOC容器帮我们查找以及注入依赖对象而作为操作者的对象只能被动的接受依赖对象。 所以可以看出不是手动去创建对象而根据配置文件Spring通过IOC容器进行依赖注入然后对对象进行创建销毁。所以是说控制对象生存周期的不再是引用它的对象而是 Spring。对于某个具体的对象而言以前是它控制其他对象现在是所有对象都被 Spring 控制所以这叫控制反转。 依赖注入DI依赖注入和IOC两者其实可以说IOC是一种编程思维而依赖注入是具体实现这个编程思维的方式。 其实最常用的两种注入方法是set注入构造注入当然这个在spring中听过xml或者注解进行体现。 通过依赖注入机制 只需要通过简单的配置而无需任何代码就可指定目标需要的资源完成自身的业务逻辑而不需要关心具体的资源来自何处由谁实现。 当然组件之间依赖关系由容器在运行期决定形象的说即由容器动态的将某个依赖关系注入到组件之中。 当然依赖注入的目的并非为软件系统带来更多功能而是为了提升组件重用的频率并为系统搭建一个灵活、可扩展的平台。 其实在Spring中的IOC容器使用了工厂模式以及反射如果没有反射也就没有必要进行配置信息。 现在有两个问题了Spring中是通过那个类进行处理这个配置信息的毕竟配置信息可以是xml或者注解而这个类必然要进行判断之后才能处理的。 创建bean容器 Spring的IOC容器就是IOC思想的一种实现而在IOC容器IOC容器存放着bean 所以被叫做 Spring bean容器的创建需要看一个接口BeanFactory这个是创建Spring bean容器的根接口这个不是我说的而是源码 但是BeanFactory这个是Spring内部使用的接口面向Spring本身不是给开发人员用的。一般使用其子接口ApplicationContext而这个接口在前面例子中很多体现现在可以看下其关系 常用的ApplicationContext实现类或接口 类/接口描述ClassPathXmlApplicationContext通过读取类路径下的XML格式配置文件创建的IOC容器对象FileSystemXmlApplicationContext通过文件系统路径下XML格式配置文件创建的IOC容器对象ConfigurableApplicationContextApplicationContext的子接口包含了一些扩展方法比如close()refresh等。AnnotationConfigApplicationContext完全注解的时候用来加载带有配置注解的类。WebApplicationContext为web应用准备是基于web环境开发创建IOC容器对象并将对象存入ServletContext域中。 得到bean信息 其实这个需要一个接口BeanDefinition Definition的英文意思是解释释义。 不得说母语英语真是友好看名知其意还是需要学英语的。 然后看一下其源码是如果解释的 翻译如下 BeanDefinition 描述了一个实例信息其拥有的属性只构造方法中带有的参数以及具体实现去其它更多信息。 当然这个类加载信息需要通过配置文件或者注解才可以而这个配置文件或者注解也有一定的标准不然呈现也不能读取这些配置的信息。具体源码就不再此篇聊了。 还有在spring中也不可能只有一个bean的信息所以在spring中用一个BeanDefinitionMap进行保存信息。 可以用一个图来看一下这个IOC创建容器的大概过程 图中还有缓存这个概念毕竟生存的bean有的时候会被重复使用如果调用某个bean的时候先判断是否被保存如果有就直接调用如果没有就在返回查看BeanDefinitionMap中需要的bean的配置信息。图中既然写了一级缓存那就是spring有多级缓存了这个后面有机会再聊吧。 自己写一个依注释实现IOC注入的代码 代码的结构如下 代码直接能用可以复制在自己环境内就可以运行。而且每步带有注解。 首先实现两个接口Di和Bean Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) public interface Bean {}Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) public interface Di { // 无法使用Object作为注解参数String value(); } 自己定义一个容器接口MyApplicationContext //创建一个自己Spring容器的接口 这个将BeanFactory和ApplicationContext融为一个方便写不然需要写父接口和子接口 public interface MyApplicationContext {Object getBean(Class clazz); } 实现容器接口的类MyAnnotionAoolicationContext public class MyAnnotionAoolicationContext implements MyApplicationContext {private static Annotation beanAnnotation;// 用一个map存储bean的信息 模仿 BeanDefinitionMapprivate static MapClass, Object MyBeanDefinitionMap new HashMapClass, Object();// 作为一个加载扫描其下包或者类的根目录private static String rootFile;Overridepublic Object getBean(Class clazz) {return MyBeanDefinitionMap.get(clazz);}// 创建构造方法加载配置文件或者带有自定义注解的 // 这个直接使用的是通过注解进行创建容器不是通过xml配置文件进行配置public MyAnnotionAoolicationContext(String packagename) {try {// 因为传递过来包名路径是. 转换为路径符合String packageFile packagename.replace(., File.separator);// 得到绝对路径 因为会部署在不同的电脑上目的是遍历其下的文件中是否都有注解URL url Thread.currentThread().getContextClassLoader().getResource(packageFile);String fileString URLDecoder.decode(url.getFile(), utf-8);rootFile fileString.substring(1, fileString.length() - packageFile.length());// System.out.println(fileString);loadFile(fileString);} catch (Exception e) {System.out.println(e);throw new RuntimeException(e);}loadDi();}// 遍历根路径下的文件中带有注解的文件private static void loadFile(String fileString) {try {File file new File(fileString); // 首先判断是否是文件夹if (file.isDirectory()) {File[] childFileArr file.listFiles();// 判断文件夹是否为空如果为空就直接跳出即可if (childFileArr.length 0 || childFileArr null) {return;} else {// 遍历所有的文件判断是文件还是文件夹for (File childFile : childFileArr) {if (childFile.isFile()) { // System.out.println(childFile);// 通过路径得到反射所需要的包路径类名// 这样得到的文件不是以.java 结束而是以.classString childFileString childFile.toString();String forName childFileString.substring(rootFile.length(), childFileString.length() - .class.length()).replace(\\,.);Class clazz Class.forName(forName);// 自己写的注解一般作用在类上而不是接口上所以将接口,和注解类排除if(!clazz.isAnnotation() !clazz.isInterface()){ // 判断类上是否有bean注解如果有就实例化 getAnnotation针对的是类上的注解 // 不过一般如果类的实例化上都没有注解那么方法上带注解实现ioc 也就没有多少意义了Annotation beanAnnotation clazz.getAnnotation(Bean.class);// Class sClass.forName(com.xzd.myannotion.Bean); // System.out.println(s.getFields());if(beanAnnotation!null){ // 为了方便暂时使用空构造方法Object bean clazz.newInstance();System.out.println(forName);System.out.println(clazz); // 因为一般针对的是接口所以保存MyBeanDefinitionMap中如果有接口就以接口作为主键if(clazz.getInterfaces().length0) { // 默认使用第一个接口吧MyBeanDefinitionMap.put(clazz.getInterfaces()[0], bean);}else {MyBeanDefinitionMap.put(clazz, bean);}}}} else {loadFile(String.valueOf(childFile));}}}}} catch ( Exception e) {System.out.println(e);throw new RuntimeException(e);}}// 前面的实例对象还可以为属性进行注入值private void loadDi(){try {// 一般类上带有注解的才会在属性上带有ioc注入所以就不便利所有的类直接从MyBeanDefinitionMap获取即可SetMap.EntryClass, Object set MyBeanDefinitionMap.entrySet();IteratorMap.EntryClass, Object iterator set.iterator();while(iterator.hasNext()){Map.EntryClass, Object entry iterator.next();Class clazz entry.getKey();Object bean entry.getValue(); // System.out.println(bean111);// 得到属性从属性判断是否有注入数据Field[] fields clazz.getDeclaredFields();System.out.println(fields.length);for(Field field:fields){Annotation annotation field.getAnnotation(Di.class);if(annotation!null){Class fieldClass field.getType();fieldClass.getName();System.out.println(fieldClass.getName()111);String fieldName field.getName();Object value ((Di) annotation).value();Constructor fieldconstructorfieldClass.getConstructor(String.class);field.setAccessible(true);field.set(bean, fieldconstructor.newInstance(value));};}}} catch (Exception e) {throw new RuntimeException(e);}}} 为了方便直接在一个bean上进行注解 Bean public class Student {Di(12)Integer age;Di(王五)String name;Overridepublic String toString() {return Student{ age age , name name \ };} }测试方便调用test public class testSpring {public static void main(String[] args) {// 直接从目录上开始加载 MyApplicationContext myApplicationContext new MyAnnotionAoolicationContext(com.xzd);Student student (Student) myApplicationContext.getBean(Student.class);System.out.println(student);} }
http://www.hkea.cn/news/14513493/

相关文章:

  • 金融理财网站建设科技小制作 手工 简单
  • 专业的网站建设宝安西乡如何制作app软件步骤
  • 电子商务网站建设各项费用预算是多少烟台网站建设技术托管
  • 网站续费模版网站建设的售后服务
  • 地方志网站建设甘肃网站备案审核
  • 做汽车价格的网站wordpress 新浪微博
  • saas建站 cms单县住房和城乡建设局网站
  • 个人网站作品下载网站建设与网页设计大作业
  • 郑州汽车网站建设哪家好最新军事新闻报道
  • 网站建设与管理试题及答案芜湖龙湖建设工程有限公司网站
  • 网站制作公司服务东莞怎样做网站建设
  • 企石网站建设注册公司的流程图
  • 腾讯理财是什么样的做网站江门网站建设设计
  • 企业培训师资格证网络优化主要做什么
  • aap手机网站建设个人微博网页制作代码教程
  • 陕西十二建设有限公司网站怎么制作网站教程步骤视频
  • 有没有做皮艺的网站预算有哪些网站做私活
  • 做好网站功能性建设工作微商网站如何做推广方案
  • 做网站的出路wordpress 动作钩子
  • 2003建网站做网站软件j
  • 国外代理网站外贸推广引流系统
  • 沧州网站建设代理价格wordpress网站加速
  • 网站模板html 汽车膜wordpress 文章长度
  • 产品网站怎么做网络广告的特点是
  • 顺义网站做的比较好的公司网站初期建设的成本来源
  • 北京网站建设公司拟网站建设怎么配置伪静态文件
  • html的网站模板下载wordpress域名如何申请
  • 珠海网站设计费用湖南建设门户网站
  • 做网站360好还是百度好用自己的电脑做服务器建网站
  • 石家庄做外贸的网站医院网站建设价格