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

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】获取上述资料
  重要的事情说三遍,转发+转发+转发,一定要记得点赞转发哦!!!

遇到这种微信号,千万别转账通过手机进行支付交易如今已是相当普遍但各类骗局也往往暗藏其中比如像这样的聊天记录就让人极为绝望付完款,催发货时,发现已被拉黑卖家人间蒸发,只剩下可怜的你钱货两空。出现风险提醒格外当大跌眼镜!中航机电业绩不及预期,另一只军工龙头股Q4净利负增长,军工板块还有戏吗?炒作军工板块的逻辑是资产注入和并购重组,至于业绩增长是次要的。军工板块市盈率往往较高,百倍市盈率较为普遍,背后是资产整合预期,像凤凰光学获得优质资产以后连续一字涨停,成为赢家的投资一文教你识别USB3。03。13。24其实原本USB3。03。13。2是很好区分的,从上图的表格可以看到,它们的传输速率有很大差异,USB3。1是USB3。0的2倍,USB3。2又是USB3。1的2倍。但自从增加了个位零立(LINGLEE)黑武士X1,自清洁剃须刀潮流来了吗?剃须刀之于男生,就像香水之于女生,它塑造出男生的形象,保证男生在每一个清晨都能够神清气爽容光焕发。不同的剃须刀有着不同的优势,手动干净但费时,电动快捷但有声音还需充电,二者各有优势戴助听器可以打电话吗,效果怎么样?您好佩戴助听器是可以打电话的,助听器有自动电话或双耳电话功能,也可以通过无线或蓝牙与手机进行连接,无论是打电话开会看视频都大大的提高清晰度,根据佩戴者本人的言语分辨情况进行选择,言激光雷达上市公司汇总激光雷达上市个公司汇总巨星科技(002444)市值315。2亿公司的激光雷达主要是较远距离和较高精度的激光雷达产品,大规模用于复杂环境和室外环境,同时适用于中高速运行的物体,能应用预计2022年CPU和GPU价格将会上涨,英特尔AMD和英伟达都不例外在过去的一年多里,半导体行业遭遇的供应短缺严重影响了消费者选购电脑电子产品。虽然业界有企业或重量级人物不时出来安抚,预测什么时候供应和价格才会正常,但事实上谁都不能确认供应链上的短长川科技拟2。74亿元收购长奕科技97。67股权来源上海证券报1月21日晚,长川科技披露,拟通过发行股份向天堂硅谷杭实LeeHengLee及井冈山乐橙购买其合计持有的长奕科技约97。67股权,交易价暂定2。74亿元。交易完成后,告别互联网大厂,我选择了退居二线作者陈晓妍编辑张子睿回家过完年,还要再回来吗?离春节不到2周,在一线城市的互联网打工人又要面对这道选择题。尤其今年互联网入冬,让天平上离开的一端又多了些许砝码。2年前,没有寒流,大消息称吉利拟收购魅族手机小而美敌不过100亿作者丨邱晓芬杨逍编辑丨苏建勋杨轩36氪从多个独立信源获悉,吉利集团旗下手机公司正与手机厂商魅族接触洽谈收购事宜。交易还在进行中,正在做DD(尽职调查)。多位接近交易的人士对36氪表比iPhone13值得买?廉价大屏苹果手机曝光全面屏设计1月18日消息,上周外媒91mobile分享了一组苹果iPhoneSE3的渲染图,表示新机会采用接近iPhoneXR的造型,全面屏设计并支持FaceID。今天,显示行业分析师Ros
腾讯云的英雄联盟S10保卫战10月31日的上海,天气已经有些转凉,上汽浦东足球场的上空弥漫着一股兴奋焦灼复杂的情绪,因为再过几个小时,这里即将上演英雄联盟S10的总决赛,时隔六年的中韩对战,今年传奇的中国黑马没有大招的美团,凭什么帮助餐饮商户提升数字化水平你知道餐饮行业的标准化流程烹饪已经进化到哪一步了吗?为了保证每一份炒面只用1克盐。餐厅会严格监督厨师执行情况,在线上盘库时检查盐的用量。如果当天卖了1000份面,那么盐的用量必须控为什么说客厅可能成为音乐ToB的下一个战场智能电视品牌们的竞争正在上升到一个更高的维度。12月12日,长虹在成都举办了一场发布会。一方面,宣布与腾讯音乐娱乐集团旗下酷狗音乐爱听卓乐达成战略合作另一方面,发布全球首台5GAI从跟随与博弈,到弯道超车,中国移动通信发展到底经历了什么?清早上火车站,长街黑暗无行人,卖豆浆的小店冒着热气从前的日色变得慢车,马,邮件都慢一生只够爱一个人。这是一首木心先生作于弱冠之年的从前慢,引人共鸣意向叠加出的淳朴率真的氛围,一直被土偏方治百病ampampquot白大褂ampampquot导购起底伪健康短视频背后的黑产业链我们期待悲剧消失,它却总是以新的形式上演中老年人们躲过了电视上神医神药等吃人血馒头的虚假广告,没躲过伪科普短视频这一劫。上个月17号,大v是咻仔呀的一条充满着愤怒和痛心的微博,把某第1000家小米之家开业,小米新零售逆势增长小米之家智敬成都,第1000家小米之家在成都开业。2017年,雷军表示,未来三年计划开通1000家小米之家,12月6号成都旗舰店的开业,完成了雷军提出的三年计划,实现了千店启航。新为什么说百度收购YY合情合理?近日,有媒体爆料,百度拟收购YY国内业务。截止目前,百度和YY双方均对此传闻不予置评。但是不少媒体判断,完成收购的可能性极大。如果该收购完成,它将很可能成为今年移动互联网领域最大的年轻化的腾讯微视,年轻化的财报腾讯微视又在传统财经资讯的展示上玩出了新花样。11月13日,腾讯公司正式发布了Q3财报,财报数据一如既往的亮眼2020年Q3,公司整体营收1254。47亿元,同比增长29,净利润(世界冠军王楠抗癌成功16年,她有何秘诀?医生此癌是最善良的癌东京奥运会闭幕了,我国运动员发挥出色,赢得漂亮。前国乒运动员王楠为了奖励获得冠亚军的国乒选手,霸气放言,给每位冠亚军送一套房,估算大致总价值3500万元。王楠除了24枚乒乓球金牌得女子因暴发性糖尿病住进ICU,医生提醒这种病好发于3类人近日,广东省一位年仅29岁的林女士,因突然出现口干腹痛头晕等症状,而且还频繁呕吐,到医院检查后发现林女士的血糖高达38。86mmolL,远高于正常值,而且血中酮体白细胞血淀粉酶pH类风湿性关节炎到底是什么疾病?医生告诉你真相你是否有过这类感受,早晨起床时关节活动不灵活,颈部疼痛无力,关节发热伴发贫血类风湿结节。这类情况严重的时候甚至呼吸系统及心脏受累,致残率高。那可要注意了!首先我们要知道什么是类风湿