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

spring学习笔记,一看就会,一篇文章带你深入spring(附源码解析)

  前言
  学习过Spring框架的人一定都会听过Spring的IOC(控制反转) 这个概念,对于初学Spring的人来说,总觉得IOC是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring IOC的理解。IOC是什么
  IOC——Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想。在Java开发中,IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好IOC呢?理解好IOC的关键是要明确"谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了",那我们来深入分析一下:
  (1)谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
  (2)为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。
  用图例说明一下,传统程序设计如图,都是主动去创建相关对象然后再组合起来:
  当有了IOC的容器后,在客户端类中不再主动去创建这些对象了,如图所示:
  接下来我们说一下IOC的4个特性1. lazy-Init延迟加载
  Bean对象的延迟加载(延迟创建)
  ApplicationContext 容器的默认 为是在启动服务器时将所有 singleton bean 提前进 实例化。提前实例化意味着作为初始化过程的 部分,ApplicationContext实例会创建并配置所有的singleton bean。 完整版Java面试题地址:JAVA后端面试题整合1.1 XML方式开启延迟加载:
  lazy-init="" 配置bean对象的延迟加载 ,true或者false false就是立即加载 复制代码 复制代码
  我们先来看一下当lazy-init="false" 也就是立即加载的时候:
  可以看到,在容器启动后,getBean之前,lazyResult这个bean已经存在了。
  然后我们把lazy-init="true",设置为true
  然后我们F8往下走一步:
  发现出现了lazyResult1.2 注解开启延迟加载:
  @Lazy:
  1.3全局配置——default-lazy-init="":
  在bean的根标签中:
  应用场景: (1)开启延迟加载 定程度提 容器启动和运转性能 (2)对于不常使 的 Bean 设置延迟加载,这样偶尔使 的时候再加载,不必要从 开始该 Bean 就占 资源2. FactoryBean和BeanFactory2.1 BeanFactory
  容器的顶级接口,定义了容器的一些基础行为,负责生产和管理Bean的一个工厂,具体使用它下面的子接口类型,比如ApplicationContext2.2 FactoryBean
  spring中的bean有两种
  普通bean
  工厂bean(FactoryBean) 可以生产某一个类型的bean实例(返回给我们),也就是说我们可以借助于它自定义bean的创建过程。
  Bean创建的三种 式中的静态 法和实例化 法和FactoryBean作 类似,FactoryBean使 较多,尤其在Spring框架 些组件中会使 ,还有其他框架和Spring框架整合时使 //可以让我们自定义Bean的创建过程,完成复杂bean定义 public interface FactoryBean {  //返回FactoryBean创建的实例,如果isSingleton返回true,则该实例会放到Spring容器的单例缓存池中Map  @Nullable  T getObject() throws Exception;      //返回FactoryBean创建的bean类型  @Nullable  Class<?> getObjectType();   //返回作用域是否单例  default boolean isSingleton() {   return true;  } } 复制代码 复制代码2.2.1 新建类CompanyFactoryBean,实现FactoryBean接口,并重写方法:public class CompanyFactoryBean implements FactoryBean {     private String companyInfo;//注入公司名称,地址,规模  以逗号分隔      public void setCompanyInfo(String companyInfo) {         this.companyInfo = companyInfo;     }      @Override     public Company getObject() throws Exception {         //创建复杂对象Company         Company company=new Company();         String[] split = companyInfo.split(",");         company.setName(split[0]);         company.setAddress(split[1]);         company.setScale(Integer.parseInt(split[2]));          return company;     }      @Override     public Class<?> getObjectType() {         //返回bean的类型         return Company.class;     }      @Override     public boolean isSingleton() {         //是否是单例         return true;     } } 复制代码 复制代码public class Company {     private String name;     private String address;     private int scale;  //省略getset 和toString } 复制代码 复制代码2.2.2 xml文件中配置bean      复制代码 复制代码2.2.3 测试    @org.junit.Test     public void test(){         ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");         Object companyBean = applicationContext.getBean("companyBean");         System.out.println(companyBean);     } //结果返回的是 Company{name="拉钩", address="中关村", scale=500}    复制代码 复制代码
  虽然在xml配置文件中配置的bean的class="com.lagou.edu.factory.CompanyFactoryBean" 但是返回的Company类型。
  如何返回CompanyFactoryBean类型呢?
  3. 后置处理器
  Spring提供了两种后处理bean的扩展接 ,分别为 BeanPostProcessor 和BeanFactoryPostProcessor,两者在使 上是有所区别的。
  初始化(BeanFactory)—> Bean对象
  在BeanFactory初始化之后可以使 BeanFactoryPostProcessor进 后置处理做 些事情
  在Bean对象实例化(并不是Bean的整个 命周期完成)之后可以使 BeanPostProcessor进 后置处理做 些事情
  注意:对象不 定是springbean, springbean 定是个对象3.1 SpringBean生命周期图
  按照上述描述的打印一下。看看是否一致://实现了BeanNameAware、BeanFactoryAware、ApplicationContextAware、InitializingBean,DisposableBean接口 public class Result implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean {     private String status;     private String message;  //省略getset toString方法      @Override     public void setBeanFactory(BeanFactory beanFactory) throws BeansException {         System.out.println("4.BeanFactoryAware:"+beanFactory);     }      @Override     public void setBeanName(String name) {         System.out.println("3.BeanNameAware:"+name);     }      @Override     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {         System.out.println("5.ApplicationContextAware:"+applicationContext);     }      @Override     public void afterPropertiesSet() throws Exception {         System.out.println("7.InitializingBean");     }      public void initMethodTest(){         System.out.println("8.initMethod");     }      @PostConstruct     public void postCoustrcut(){         System.out.println("postCoustrcut");     }      //销毁之前执行     @PreDestroy     public void preDestroy(){         System.out.println("销毁之前执行");     }      @Override     public void destroy() throws Exception {         System.out.println("DisposableBean");     } }  /** 复制代码 复制代码拦截实例化之后的对象(实例化了 并且属性注入了)     拦截所有的  */ @Component public class MyBeanPostProcessor implements BeanPostProcessor {     @Override     public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {         if ("lazyResult".equalsIgnoreCase(beanName)){             System.out.println("MyBeanPostProcessor before");         }         return bean;     }      @Override     public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {         if ("lazyResult".equalsIgnoreCase(beanName)){             System.out.println("MyBeanPostProcessor After");         }         return bean;     } } 复制代码 复制代码//XML配置文件中:      复制代码 复制代码//测试:     @org.junit.Test     public void testBeanLazy(){         ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");         Object lazyResult =  applicationContext.getBean("lazyResult");         System.out.println(lazyResult);         applicationContext.close();     } 复制代码 复制代码
  打印出:
  4. 其他:
  资料获取方式:关注小编+转发文章+私信【857】获取上述资料
  重要的事情说三遍,转发+转发+转发,一定要记得点赞转发哦!!!

MGONE背后的大佬有多厉害?混沌学园专门为此开了一个会新消费时代下,面对全球市场的发展趋势,汽车产业如何变革与创新近日,MG携手创新学习机构混沌学园,共同举办了一场以重新定义变革中的新消费时代为主题的分享会,此次分享会,是专业人士对模荣耀50SE值不值得买?看完这篇文章就懂了暑假近在眼前,学生群体成为了商家们掘金的潜在群体,而智能手机领域的促销大战更是早已打响。放眼市场,手机厂商竞相推出新品,各大卖场的促销活动此起彼伏,新一轮换机潮呼之欲出。在众多新机雷军泪洒现场!互联网大佬们的创业往事雷总哭了,不过不是这次。昨晚,小米创始人雷军举办了2021个人年度演讲,暨小米秋季新品发布会。除了带来几款科技感十足的新货,雷军在现场还回顾了小米成立十一年来所取得的种种成就第三次陆半导体业大规模扩产,催生10年的成长期芯片短缺危机未解反而有继续恶化的趋势,扩产成为大陆半导体行业主流,根据中国国际招标网显示,8月以来,中芯绍兴上海积塔华虹半导体长江存储等半导体企业已新增多项设备招标,使设备厂获益。理想汽车曲线救企,少装2颗雷达可以更快提车全球芯片危机爆发导致多个产业发展受阻过去的一年里不少汽车企业不得不停产停工停产带来的是销量下降车企正常的做法整合多方供应商让零部件能正常供应但理想汽车想到了新办法选择3雷达版的可以全球最快充电桩15分钟充满,电车长途出行不用怕国庆假日期间新能源车主在高速服务区排队4h充电的新闻上了热搜新能源车充电难问题再次引发关注新能源车充电难的原因是什么?是充电桩安装数量不足?还是电桩故障率较高?能否有改进的办法呢据联电计划再砸百亿在新加坡建晶圆厂近日,市场传出,晶圆代工厂联电计划将在新加坡兴建第二座12寸新厂,月产能至少2至3万片,投资金额超过1000亿元新台币(约人民币229亿元),业界推估,新厂可能采40奈米以下制程生格力遭控诉,被美国罚款9100万美元百能云芯21世纪经济报道指出,在美东时间29日,美国司法部官网披露,司法部与中企格力达成延迟起诉协议,格力同意接受9,100万美元的罚款,赔偿因有缺陷除湿机而引发火灾的受灾者。报道称,珠海78官测万代CONVERGEKAMENRIDER普通版第二十二弹文章转自78DM首先在这里感谢万代食玩部提供评测样品商品名CONVERGEKAMENRIDER普通版第二十二弹发售时间2021年8月商品价格500日元我们本期测评的是CONVERG模玩周边橡子共和国多拉船长纪念夹克外套1986年上映的经典日本动画电影天空之城在今年迎来了上映35周年,这部首作吉卜力工作室的电影作品,可说对许多吉卜力迷心中有着不凡地位。今日宣布推出上映35周年的纪念夹克外套,以飞行芯片荒持续蔓延,国产芯片能否觉醒?从去年下半年开始全球芯片荒席卷整个汽车产业各国汽车厂商纷纷停工停产据美国伯恩斯坦研究公司预计2021年全球范围内的汽车芯片短缺将造成多达450万辆汽车产量损失相当于全球汽车年产量的
未来五年人工智能将实现的五大突破资本实验室今日创新观察聚焦前沿科技创新与传统产业升级不论是可以和你对话的智能音箱,还是能够自己作画的虚拟艺术家不论是能够帮助农民准确判断种植和施肥时间的农场管理系统,又或者是能够在华为P40ProPro国行发布顶配8888昨天晚上1930,华为举行了时长两个多小时的新品发布会,正式带来了华为P40系列国行版,以及一系列的手机配件类新品和其他新品华为P406128GB售价4188元,8128GB售价4即将发荣耀30Pro带你提前看首发麒麟985干翻P40?上个月发布了荣耀30系列首款新机荣耀30S,首发麒麟8205G处理器,定位2K价位段属中端机,现在荣耀30系列的旗舰机荣耀30ProPro也来了,4月15日即今天下午1430发布,荣耀宣布将于5月20日发布荣耀X10系列荣耀宣布将于5月20日发布荣耀X10系列,今天官博还晒出了荣耀X10的真机。荣耀X10采用6。63英寸24001080分辨率的LCD屏,侧边实体指纹,机身三围163。776。58。增强现实一场正在到来的医疗革命资本实验室今日创新观察聚焦前沿科技创新与传统产业升级王进图像化可以让医生的诊断决策和治疗更加准确,可以说是医疗史上非常重要的一项技术突破。近几年,通讯技术的发展推动了空间计算的快速日本时装集团Onward将关闭700家门店,并加速数字化变革资本实验室李鑫电子商务的发展在带来全球传统实体店关店潮的同时,也加快了传统零售商的数字化转型速度。近日,日本服装集团OnwardHoldings宣布,将在2021年2月截止的当前财坏习惯会毁了你的电脑?不!相反,这些坏习惯反而能让电脑更好用Hello大家好,我是兼容机之家的小牛!最近看到一篇文章,讲的是电脑都是怎么被用坏的,作者列举了电脑使用过程中的几点坏习惯,我感觉作者表达的主题是有一定道理的。但是,这些坏习惯其实日本人脑洞大开,推出AMD锐龙处理器自动售卖机,一颗CPU才卖60元兼容机之家小牛带你发现更多新潮数码资讯!AMD锐龙处理器近年来凭借着高性价比一举赢下了DIY硬件市场,很多玩家装机时会首选实惠的AMD处理器。借着这股势头,日本的扭蛋市场上竟然出现商务部最新回应外贸工厂货已做好,发不出去问题往年的双11,很多制造业都会开足马力加班,因为这将是一年中收尾的爆单期。曾被寄予厚望的国外圣诞购物季,今年或许不再像往年那样火热!!圣诞销售旺季提前,外国客户抢货义乌厂商却愁眉不展世界各国客户的交易习惯汇总1非洲交易习惯看货购买,一手交钱,一手交货,或赊货代销。订单量定量小,品种多要货急。注意事项非洲国家实行的进出口商品装船前检验,在实际操作中增加了我方费用,延误了我方交货期,阻碍了未来今日研究所2019技术趋势报告资本实验室今日创新观察聚焦前沿科技创新与传统产业升级近期,著名研究机构未来今日研究所(FutureTodayInstitute)发布了2019技术趋势报告。该报告涉及人工智能网络安