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

保险公司招聘网站中英切换的网站咋做

保险公司招聘网站,中英切换的网站咋做,中学网站建设工作实施方案,浏览器做单页网站项目Spring中的IOCIoC全称是Inversion of Control#xff0c;就是控制反转#xff0c;他其实不是spring独有的特性或者说也不是java的特性#xff0c;他是一种设计思想。而DI(Dependency Injection)#xff0c;即依赖注入就是Ioc的一种实现方式。关于Ioc和DI的具体定义和优缺点…Spring中的IOCIoC全称是Inversion of Control就是控制反转他其实不是spring独有的特性或者说也不是java的特性他是一种设计思想。而DI(Dependency Injection)即依赖注入就是Ioc的一种实现方式。关于Ioc和DI的具体定义和优缺点等大家可以自行查找资料了解一下这里就不详细赘述总之spring的IoC功能很大程度上便捷了我们的开发工作。在实现我们的Ioc之前我们先了解一下spring的依赖注入在spring中依赖注入有三种方式分别是接口注入(Interface Injection)设值方法注入(Setter Injection)构造注入(Constructor Injection)Componentpublic class ComponentA {Autowired // 1.接口注入private ComponentB componentB;Autowired // 2.设值方法注入public void setComponentB(ComponentB componentB) {this.componentB componentB;}Autowired // 3.构造注入public ComponentA(ComponentB componentB) {this.componentB componentB;}}循环依赖注入如果只是实现依赖注入的话实际上很简单只要利用java的反射原理将对应的属性‘注入’进去就可以了。但是必须要注意一个问题那就是循环依赖问题。循环依赖就是类之间相互依赖形成了一个循环比如A依赖于B同时B又依赖于A这就形成了相互循环。// ComponentAComponentpublic class ComponentA {Autowiredprivate ComponentB componentB;}// ComponentBComponentpublic class ComponentB {Autowiredprivate ComponentA componentA;}那么在spring中又是如何解决循环依赖问题的呢我们大致说一下原理。如果要创建一个类先把这个类放进正在创建池中通过反射等创建实例创建成功的话就把这个实例放入创建池中并移除正在创建池中的这个类。每当实例中有依赖需要注入的话就从创建池中找对应的实例注入进去如果没有找到实例则先创建这个依赖。利用了这个正在创建的中间状态缓存让Bean的创建的时候即使有依赖还没有实例化可以先把Bean放进这个中间状态然后跑去创建那个依赖假如那个依赖的类又依赖与这个Bean那么只要在正在创建池中再把这个Bean拿出来注入到这个依赖中就可以保证Bean的依赖能够实例化完成。再回头来把这个依赖注入到Bean中那么这个Bean也实例化完成了就把这个Bean从正在创建池移到创建完成池中就解决了循环依赖问题。虽然spring巧妙的避免了循环依赖问题但是事实上构造注入是无法避免循环依赖问题的。因为在实例化ComponentA的构造函数的时候必须得到ComponentB的实例但是实例化ComponentB的构造函数的时候又必须有ComponentA的实例。这两个Bean都不能通过反射实例化然后放到正在创建池所以无法解决循环依赖问题这时候spring就会主动抛出BeanCurrentlyInCreationException异常避免死循环。* 注意前面讲的这些都是基于spring的单例模式下的如果是多例模式会有所不同大家有兴趣可以自行了解。实现IOC现在可以开始实现IOC功能了增加注解先在zbw.ioc包下创建一个annotation包然后再创建一个Autowired的注解。这个注解的Target只有一个ElementType.FIELD就是只能注解在属性上。意味着我们目前只实现接口注入的功能。这样可以避免构造注入造成的循环依赖问题无法解决而且接口注入也是用的最多的方式了。如果想要实现设值方式注入大家可以自己去实现实现原理几乎都一样。package com.zbw.ioc.annotation;import ...Target(ElementType.FIELD)Retention(RetentionPolicy.RUNTIME)public interface Autowired {}实现IOC类package com.zbw.ioc;import ...Slf4jpublic class Ioc {/*** Bean容器*/private BeanContainer beanContainer;public Ioc() {beanContainer BeanContainer.getInstance();}/*** 执行Ioc*/public void doIoc() {for (Class clz : beanContainer.getClasses()) { //遍历Bean容器中所有的Beanfinal Object targetBean beanContainer.getBean(clz);Field[] fields clz.getDeclaredFields();for (Field field : fields) { //遍历Bean中的所有属性if (field.isAnnotationPresent(Autowired.class)) {// 如果该属性被Autowired注解则对其注入final Class fieldClass field.getType();Object fieldValue getClassInstance(fieldClass);if (null ! fieldValue) {ClassUtil.setField(field, targetBean, fieldValue);} else {throw new RuntimeException(无法注入对应的类目标类型: fieldClass.getName());}}}}}/*** 根据Class获取其实例或者实现类*/private Object getClassInstance(final Class clz) {return Optional.ofNullable(beanContainer.getBean(clz)).orElseGet(() - {Class implementClass getImplementClass(clz);if (null ! implementClass) {return beanContainer.getBean(implementClass);}return null;});}/*** 获取接口的实现类*/private Class getImplementClass(final Class interfaceClass) {return beanContainer.getClassesBySuper(interfaceClass).stream().findFirst().orElse(null);}}在知道IOC的原理之后发现其实真的是非常简单这里用了几十行的代码就实现了IOC的功能。首先在Ioc类构造的时候先获取到我们之前已经单例化的BeanContainer容器。然后在doIoc()方法中就是正式实现IOC功能的了。遍历在BeanContainer容器的所有Bean对每个Bean的Field属性进行遍历如果某个Field属性被Autowired注解则调用getClassInstance()方法对其进行注入getClassInstance()会根据Field的Class尝试从Bean容器中获取对应的实例如果获取到则返回该实例如果获取不到则我们认定该Field为一个接口我们就调用getImplementClass()方法来获取这个接口的实现类Class然后再根据这个实现类Class在Bean容器中获取对应的实现类实例。测试用例为了测试我们的Ioc和之前写的BeanContainer编写正确我们写一下测试用例测试一下。先在pom.xml添加junit的依赖...4.12...junitjunit${junit.version}test然后在test包下添加DoodleController、DoodleService、DoodleServiceImpl三个类方便测试// DoodleControllerpackage com.zbw.bean;ControllerSlf4jpublic class DoodleController {Autowiredprivate DoodleService doodleService;public void hello() {log.info(doodleService.helloWord());}}// DoodleServicepackage com.zbw.bean;public interface DoodleService {String helloWord();}// DoodleServiceImplpackage com.zbw.bean;Servicepublic class DoodleServiceImpl implements DoodleService{Overridepublic String helloWord() {return hello word;}}再编写IocTest的测试用例package com.zbw.ioc;import ...Slf4jpublic class IocTest {Testpublic void doIoc() {BeanContainer beanContainer BeanContainer.getInstance();beanContainer.loadBeans(com.zbw);new Ioc().doIoc();DoodleController controller (DoodleController) beanContainer.getBean(DoodleController.class);controller.hello();}}看到在DoodleController中输出了DoodleServiceImpl的helloWord()方法里的字符串说明DoodleController中的DoodleService已经成功注入了DoodleServiceImpl。那么我们的IOC的功能也完成了。
http://www.yutouwan.com/news/36371/

相关文章:

  • easyui做门户网站wordpress背景特效
  • 教资注册网站福州公司做网站
  • 中山专业门户网站制作咨询平面设计网站排行榜前十名有哪些
  • it培训机构哪个好一点怎样优化网站 优帮云
  • 网站推广有哪些方法python语言基础知识
  • 大连中山区网站建设wordpress搜索结果页样式
  • 天峨县建设局网站关于网页设计的论文范文
  • 大鹏新区网站建设中建建设银行网站
  • 无锡惠山区建设局网站wordpress蛋花儿最新
  • 阿里云域名备案网站建设方案西安公司建一个网站需要多少钱
  • 柳州网站建设排行榜永州做网站tuantaogou
  • 长沙商城网站苏州建设网站电话
  • 有什么做logo网站莱芜在线电话
  • 旅游网站模板免费下载做鲜花配送网站需要准备什么
  • 临汾网站建设费用网站开发背景策划书
  • 深圳做网站联系电话怎么做外链
  • php开源网站管理系统网站模板 可做采集站
  • 海南网站建站保定网站模板建站
  • 网站搭建介绍网站内容上传要求
  • soho外贸建站家里笔记本做网站 怎么解析
  • 东莞如何建设网站制作平台哪个网站可以做鸟瞰图
  • 简单的网站架构韩国外贸网站
  • 珠海营销型网站哪家好西安网站建设哪家
  • 三合一模板网站wordpress如何修改首页
  • 复刻手表网站免费留电话号码的广告
  • 发布自己的做家教的网站安阳手机网站建设
  • 做兼职的设计网站wordpress如何上传超过2m
  • 微信公众号做推送的网站养殖场网站源码
  • 邯郸建立网站费用html5 metro风格网站
  • 苏州电子商务网站设计重庆小程序开发公司