范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

不懂控制反转么?大白话讲清楚spring中这些晦涩的概念

  前面介绍了spring环境的搭建,在搭建spring环境的时候分为java环境和javaWeb环境,在javaWeb环境下通常会结合springMVC使用,在java项目中只需要把spring的包导入工程中,一般初学者会把所有的包全部导入,然后就可以通过获得applicationContext,把类的实例化交给spring管理,然后从spring容器中获得类的实例。
  spring中有控制反转(Ioc)和依赖注入(DI)两个概念,Ioc和DI是spring的核心概念,同时也是一种新的编程思想。
  控制反转(Ioc)
  控制反转,顾名思义就是控制权的改变,在没有接触spring之前,我们要使用一个类的实例,必须使用new的方式生成一个对象,这个过程的主动权掌握在程序员亦自己写的程序中,但是使用了spring之后,实例的创建不再由程序员手动实现,而是由spring容器来完成,实现了控制的反转,即主动权交给了spring的IOC容器。
  依赖注入(DI)
  一个类包括属性和方法,在创建了实例对象之后,或者在创建实例对象的同时,需要初始化成员变量(属性),在spring之前成员变量的初始化可以通过构造方法或setXXX方法;在spring出现之后,由于实例的创建交给了spring的IOC容器,那么成员变量的初始化也依赖于IOC容器,由容器去注入成员变量的值。
  上面介绍了IOC和DI两个概念,可以得出IOC和DI其实是在做一件事,就是spring的IOC容器创建实例对象,一切对象的实例化都交给了spring容器,在程序中不必手动使用new的方式实例化变量。
  spring提供两种不同的方式来配置spring,一种是配置文件(XML),另一种是基于注解(Annotation)。下面针对IOC和DI使用两种方式一一做介绍
  在介绍之前必须了解如何在java项目中获得spring容器,也即ApplicationContext。 ClassPathXmlApplicationContext cpac=new ClassPathXmlApplicationContext("classpath:applications.xml");
  获取ApplicationContext的方式有三种,这里使用的ClassPathXmlApplicationContext,ClassPathApplicationContext是ApplicationContext的子类,这里的cpac就是spring的IOC容器,通过它的getBean()方法可以获得容器中已经初始化的实例。
  配置文件(XML)
  假如我们有下面的学生类(student) package com.cn.study.day1;  public class Student {     private String id;     private String name;     private String age;      public String getId() {         return id;     }     public void setId(String id) {         this.id = id;     }     public String getName() {         return name;     }     public void setName(String name) {         this.name = name;     }     public String getAge() {         return age;     }     public void setAge(String age) {         this.age = age;     }     @Override     public String toString() {         return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";     } //在有了有参的构造函数,必须要提供一个无参构造     public Student(String id, String name) {         this.id = id;         this.name = name;     } //无参构造     public Student() {      }     public void init(){         System.out.println("我正在初始化!");     }     public void destroy(){         System.out.println("我将要被销毁了,。再见!");     } }
  此类有三个属性id、name、age,下面通过配置文件的方式,在spring的配置文件中配置,                                 
  在spring的配置文件中配置标签,id属性在配置文件中必须唯一,class属性指定类的权限类名,下面有标签,指定Student的三个属性,且指定了属性值,测试结果如下, Student [id=1, name=测试, age=23]
  这里可以看到输出了配置的值,这种方式是使用属性注入的方式,要求必须有setXXX方法,还有另外一种方式,通过构造方法的方式注入,                                 
  既然是通过构造方法的方式注入,那么在Student类中必须要有这个构造方法,在上面的Student类中已经有了有参的构造方法,我们知道在自定义了有参的构造方法之后,系统不会再默认的提供无参构造,我们还必须添加无参构造,下面看测试结果, Student [id=2, name=test2, age=null]
  由于我们只注入了id、name两个属性,这里可以打印出,age由于未赋值且其类型为String,则默认为null。
  上面是通过配置文件的方式,配置了根据属性、构造方法注入的方式,这个例子是比较简单的,下面看一个复杂的例子,在程序中经常会采用分层、面向接口编程的思绪,
  DAO接口 package com.cn.study.day1.inter;  public interface dbDAO {     //一个简单的dao层的保存接口     public void save(String str);     }
  service接口 package com.cn.study.day1.inter;  public interface ServiceInter {     /**      * service层的保存方法      */     public void save(String str); }
  DAO实现类 package com.cn.study.day1.inter.impl;  import com.cn.study.day1.inter.dbDAO;  public class DbDAOImpl implements dbDAO {     @Override     public void save(String str) {         // TODO Auto-generated method stub         System.out.println(str+",我会执行数据插入操作!你会吗?");     } }
  service实现类 package com.cn.study.day1.inter.impl;  import com.cn.study.day1.inter.ServiceInter; import com.cn.study.day1.inter.dbDAO;  public class ServiceImpl implements ServiceInter {     //DAO接口对象     private dbDAO dbDAO;     //setXXX方法     public void setDbDAO(dbDAO dbDAO) {         this.dbDAO = dbDAO;     }     @Override     public void save(String str) {         // TODO Auto-generated method stub         if(str!=null&&!"".equals(str)){             dbDAO.save(str);             System.out.println("执行完了DAO层的方法,我是service层的方法!");         }     } }
  在service的实现类中有一个DAO层的接口对象,我们下面看这种是如何根据属性注入的,                              
  首先,配置DAO层的bean,这里的class属性必须配置其实现类,然后配置service的实现类,在ServiceImpl中有一个dbDAO类型的属性,使用ref属性引用上面的bean。测试结果如下, 我是测试方法,我会执行数据插入操作!你会吗? 执行完了DAO层的方法,我是service层的方法!
  ref属性可以引用spring配置文件中的bean,使用id的值。
  通过上面的介绍,可以知道使用配置文件这种方式可以很方便的配置,但是当需要配置的类很多,且依赖很多的情况下,这种方式会很繁琐,那么另外一种方式便派上了用场。
  注解(Annotation)
  spring提供@Component、@Repository、@Controller、@Service四种注解,其实,只使用@Component一个便可以做到,@Repository、@Controller、@Service只是针对不同的层设置的,可以更加明显,@Repository对应DAO层,@Controller对应控制层,@Service对应服务层,使用这三个注解可以明显的分层,使系统容易理解,也可以只使用@Component。
  使用了注解需要开启组件自动扫描机制,在spring的配置文件中开启组件自动扫描机制,需要context命名空间的支持,下面是一个配置文件的例子, <?xml version="1.0" encoding="UTF-8"?>            
  在spring配置文件的头部添加context命名空间的支持,然后使用标签开启组件扫描,base-package属性指定扫描的基包,此包及此包下的子包都会进行扫描。开启了组件扫描之后,还需要自动注入,网上有说需要:,其实前面的组件扫描已经包含了此标签的作用,为此不需要配置此标签了,自动注入默认根据类型(byType)进行注入,还有根据名字注入(byName)即bean中id的值,还有根据构造方法注入(constructor)。自动注入需要@Aotuwired注解,此注解可以放在属性上,也可以放在setXXX方法上,放在属性上则可以省略setXXX方法,下面是具体的例子 package com.cn.study.day1;  import org.springframework.stereotype.Component;  @Component("su") public class StudentAnnotation {     public void print(){         System.out.println("我是使用注解生成的类!");     } }
  在类上使用@Component注解,且指定了实例的名为su,如果不指定则默认为类名称首字母小写,即studentAnnotation。
  下面是一个自动扫描和自动注入的例子, package com.cn.study.day1.inter.impl;  import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;  import com.cn.study.day1.inter.ServiceInter; import com.cn.study.day1.inter.dbDAO; @Service public class ServiceImpl implements ServiceInter {     //DAO接口对象     @Autowired     private dbDAO dbDAO;     //setXXX方法     public void setDbDAO(dbDAO dbDAO) {         this.dbDAO = dbDAO;     }     @Override     public void save(String str) {         // TODO Auto-generated method stub         if(str!=null&&!"".equals(str)){             dbDAO.save(str);             System.out.println("执行完了DAO层的方法,我是service层的方法!");         }     } }
  类上使用了@Service注解,属性上使用了@Autowired注解,这时setDbDAO()方法可以不要。@Autowired注解就是为了省略setXXX方法的,@Autowired注解默认使用的按照类型注入,如果存在多个相同类型的实例,这里自动注入会失败,为了可以正确注入,引入另外一个注解@Qualifier(value=""),此注解的value属性可以指定一个bean的id值,做到自动注入。
  @Qualifier可以用在属性或者setXXX方法上。
  综上,通过配置文件和注解两种方式介绍了依赖注入。

vivoX80搭载天玑9000才3699起,走性价比路线了?今年的高端机市场感觉始终绕不过高通8Gen1,苹果A15虽然好但又不是所有人都喜欢iPhone,但是这次vivoX80系列的定位还是非常清晰的,标准就用天玑9000处理器Pro版就vivoX80标准版手机发布天玑9000芯片105万跑分vivo在今晚1900正式发布了X80系列手机,首先发布的是vivoX80标准版,其中拥有至黑假日旅程三款配色。手机正面采用中置挖孔屏,挖孔的面积并不大,屏占比控制的很好。芯片方面中国联通和中国电信率先实现5G新通话互联互通澎湃财讯4月26日,中国联通中国电信率先在深圳杭州郑州天津等城市开通基于双方共建共享5G网络并实现互联互通的5G新通话超清视频语音通话服务(VoNRVoiceoverNewRadi刘强东涉嫌性侵女大学生案听证会,时隔2年后再次重启后沙爆料,刘强东涉嫌性侵女大学生案听证会时隔2年后再次重启。刘强东案将在美国举行公开听证会,时间在4月25日。开庭时间45PM(美国中部时间)56AM(北京时间)。听证会主要围绕着昂贵浪费且徒劳之举,张忠谋炮轰美国芯片政策,有何目的?图片来自网络张忠谋的忠告华说张忠谋近日发表了一通言论,其实不过是重复过去说过的话,但在行业内外还是引发了一些波澜。无他,他创建的台积电的江湖地位摆在那里,他个人的江湖地位也摆在那里特斯拉第二工厂太抢手!9城竞夺推特确认将被马斯克440亿美元收购国内聚焦国办稳定增加汽车等大宗消费各地区不得新增汽车限购措施(来源新浪汽车综合)云度汽车停摆数月均瑶集团成控股股东?(来源每日经济新闻)零跑高举高打CTC技术靠谱么?别重蹈S01覆停产的蔚来,悬崖上的李斌作者Quasimodo首发公主号易简读书(IDyijiandushu)因为疫情,许多产业都被迫按下暂停键。其中,蔚来汽车就因为供应链中断而停产。根据江淮工厂的产能计算,每停产一周,传音控股2021年营收净利双增长,非洲手机之王不只卖手机非洲手机之王传音控股4月26日发布2021年年报,该年度公司实现营业收入494。12亿元,较上年同期增长30。75归属于母公司所有者的净利润39。09亿元,较上年同期增长45。52部分华为手机只能充电到80,华为发布公告将尽快修复4月26日消息,昨天在华为的花粉俱乐部,有部分华为手机用户发帖称自己的手机充电至80就充不进去充不满的情况,另外也有用户反馈使用手机管家清理加速时一直显示正在扫描的情况,这种情况在国产手机这么强了,还那么多人买iPhone?看看果粉怎么说按照数据显示,到2021年底时,国产手机在全球已经拿下了55以上的智能手机市场份额。而在中国市场,国产手机更是拿下了80左右的智能手机市场份额。而这20左右的非国产手机品牌,主要是中兴发布充电宝级长续航手机!6000毫安容量的电池,有多强?就在刚刚,中兴旗下的远航30系列手机发布,不得不说中兴这系列手机的名字取得很到位,远航,顾名思义那就可以理解为长续航了,正如远航这一说法而言,远航30系列手机的电池容量,又有了一次
手机厂商为什么要自建工厂,代工厂代工不行吗?随着科技的发展,智能化和智慧化是大势所趋,我们身边的很多岗位都会被人工智能所取代,比如无人驾驶取代司机,智能零售取代售货员,智能工厂取代拧螺丝的工人等等。很多人觉得依然很遥远,其实拼团游戏在微团吉蜜投入3000元可年赚720万?或涉嫌三宗罪拼团是近年来比较火的一个商业模式,越来越多的企业和品牌先后加入,将拼团的玩法不断翻新。在深圳东莞,有一个名叫中国微团的微商品牌,也推出了拼团模式微团吉蜜。微团吉蜜投资者在抖音平台上华为受挫,小米OV集体冲锋,国产手机彻底站起来了去年华为手机在国内市场份额一度逼近50,由于华为Mate系列超强的产品竞争力,以及苹果手机的不断挤牙膏,使得华为大有追赶三星超越苹果的趋势。但是无奈的是,美国动用了国家力量来打压华一集团女员工非法集资2。1亿,获佣金691万被公诉4年时间里,浙江杭州一家资产管理公司的女员工谢某某向社会公众非法吸收存款2。1亿元,自己获得691万的高额佣金的同时,却导致投资人损失7700万。谢某某日前已被杭州市西湖区人民检察小恩惠吸引投资人,非法集资近1500万元投资高额返利大额红包抽奖礼赠这些看似老套的方法,却在盘锦地区吸金1482。5万元,共涉及32名投资人,绝对大部分为老年人。近日,辽宁省盘锦市兴隆台区人民法院对这起非法吸收公众存款案任毅从光彩万众到光彩九州,稍作努力则年入千万的说辞是否可信?近年来,以光彩集团或光彩事业之名登堂入室的互联网项目越来越多,前有明目张胆的光彩币,后有打着擦边球的光彩万众,几个月前,号称由光彩集团发起的光彩九州又出现在了不少人的朋友圈中。那么五大对策七大反诈图,教你如何反诈防骗大数据人工智能网络直播等移动通信和互联网新技术的更新迭代是电信诈骗犯罪案件高发的客观背景,但除此之外还有许多其他原因。结合审判实践,我们总结出电信诈骗犯罪案件高发的原因,主要有六个主打产品明目棒或涉嫌虚假宣传乾亿目现行四级代理制度有何特色?随着互联网技术的飞速发展,手机电脑等电子设备的普及,低头族变得越来越多,据中国互联网络信息中心(CNNIC)最新发布的第47次中国互联网络发展状况统计报告显示,截至2020年12月1小时狂卖50万台,这款千元机皇彻底火了618是一年时间中手机价格最便宜的时候,消费者的购机需求也会在此时集中释放出来。所以手机厂商们拼了命地促销以换取销量,甚至像红米realmeiQOO等手机品牌,赶在618之前发布性旗舰芯VC液冷和轻薄机身都给了,红米Note10到底阉割了什么?红米一直是让友商感到尴尬的存在,因为它总是用更低的价格跟友商做到同样的配置,凭借着极致的性价比,吸引了一大群米粉。甚至有时候由于性价比太高,一不小心就KO了自己的大哥小米。近日红米红米Note10Pro上手体验3天之后想把iPhoneXR卖了开篇之前我先吐槽一下iPhone,从iPhoneXR那一代开始,终于把双卡的问题解决了,但是依然不支持绿色聊天APP的双开,由于我需要用到2个微信,所以目前是iPhone12iPh