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

涂料网站设计公司做网站的怎样能翻页

涂料网站设计公司,做网站的怎样能翻页,wordpress 仿简书,wordpress修改默认域名前言 ???本期讲解关于spring原理Bean的相关知识介绍~~~ ??感兴趣的小伙伴看一看小编主页#xff1a;-CSDN博客 ?? 你的点赞就是小编不断更新的最大动力 ??那么废话不多说直接开整吧~~ 目录 ???1.Bean的作用域 ??1.1概念 ??1.2Bean的作用域 ??1.3代码演示… 前言 ???本期讲解关于spring原理Bean的相关知识介绍~~~ ??感兴趣的小伙伴看一看小编主页-CSDN博客 ?? 你的点赞就是小编不断更新的最大动力 ??那么废话不多说直接开整吧~~ 目录 ???1.Bean的作用域 ??1.1概念 ??1.2Bean的作用域 ??1.3代码演示 ???2.Bean的生命周期 ??2.1概念以及分类 ??2.2代码演示 ??2.3原码阅读 2.3.1解析Bean类 2.3.2实例化前处理 2.3.3创建Bean的实例 2.3.4初始化Bean ???3.总结 **??**1.Bean的作用域 ??1.1概念 在Spring IoCDI阶段, 我们学习了Spring是如何帮助我们管理对象的. 1. 通过 Controller , Service , Repository , Component , Configuration ,Bean 来声明Bean对象. 2. 通过 ApplicationContext 或者 BeanFactory 来获取对象 3. 通过 Autowired , Setter 法或者构造法等来为应程序注所依赖的Bean对象 如下代码所示 首先我们在model层定义一个实体类 public class Dog {public String name;public String getName() {return name;}public void setName(String name) {this.name name;} }然后我们在config层通过Bean将对象交给spring帮我们进行管理 Configuration public class DogBeanConfig {//使用Bean将对象交给spring进行管理Beanpublic Dog dog(){Dog dog new Dog();dog.setName(wangcai);return dog;} }那么在后面我们可以从spring容器中获取得到这里对象 SpringBootTest class SpringPrincipleApplicationTests {AutowiredApplicationContext context;Testvoid contextLoads() {//单列模式Dog dog context.getBean(dog, Dog.class);System.out.println(dog);}}当然这小编是在test包中进行测试使用的所以需要注入applicationcontext类获取spring上下文获取spring容器再拿到这里对象 此时我们再次拿对象然后进行两次对象获取打印对应的地址发现 地址是一样的, 说明每次从Spring容器中取出来的对象都是同个.这也是单例模式 单例模式: 确保个类只有个实例多次创建也不会创建出多个实例 默认情况下, Spring容器中的bean都是单例的, 这种为模式, 我们就称之为Bean的作域 所以bean的作用域概念就是 Bean的作用域是指在spring框架中一种行为模式 单例作用域表示全局只有一份他是全局共享的若进行了修改那么再次获取次对象的某个属性就是被修改过后的属性 但是如何再次访问时如何重新创建一个对象呢那么这就是其他的作用域了 ??1.2Bean的作用域 Bean的作用域分为6种如下所示 1. singleton单例作域 2. prototype原型作域多例作域 3. request请求作域 4. session会话作域 5. Application: 全局作域 6. websocketHTTP WebSocket 作域 这六种作用域的大致作用意义如下表所示 Bean的6种作用域 singleton 每个Spring IoC容器内同名称的bean只有个实例(单例)(默认 prototype 每次使该bean时会创建新的实例(单例) request 每个HTTP 请求命周期内, 创建新的实例 session 每个HTTP Session命周期内, 创建新的实例 Application 每个ServletContext命周期内, 创建新的实例 websocket 每个WebSocket命周期内, 创建新的实例 ??1.3代码演示 以下就是代码演示 Configuration public class DogBeanConfig {//使用Bean将对象交给spring进行管理Beanpublic Dog dog(){Dog dog new Dog();dog.setName(wangcai);return dog;}BeanScope(ConfigurableBeanFactory.SCOPE_SINGLETON)public Dog singletonDog(){Dog dog new Dog();return dog;}//原型作用域BeanScope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)public Dog prototypeDog(){Dog dog new Dog();return dog;}//请求作用域BeanRequestScopepublic Dog requestDog(){Dog dog new Dog();return dog;}//会话作用域BeanSessionScopepublic Dog sessionDog(){Dog dog new Dog();return dog;}BeanApplicationScopepublic Dog applicationDog(){Dog dog new Dog();return dog;} }其中单列作用域与多列作用域原型作用域使用scope注解其余作用域使用对应名字的注解内部等于 Scope(value WebApplicationContext.SCOPE_REQUEST, proxyMode ScopedProxyMode.TARGET_CLASS) 其中黄色标注部分是可以进行对应作用域的更改的其中 proxyMode为spring bean设置代理表示bean是基于CGLIB进行动态代理的 测试代码如下所示 RestController RequestMapping(/test) public class DogBeanController {Autowiredprivate ApplicationContext context;Autowiredprivate Dog singletonDog;Autowiredprivate Dog prototypeDog;Autowiredprivate Dog requestDog;Autowiredprivate Dog sessionDog;Autowiredprivate Dog applicationDog;/*** 通过比较不同作用域spring容器启动直接注入后不会进行改变原型作用域* return*/RequestMapping(/single)public String single(){//从context获取对象Dog contexDog context.getBean(singletonDog,Dog.class);return contextDog:contexDog ,autowiredDog:singletonDog;}RequestMapping(/prototype)public String prototype(){//从context获取对象Dog contexDog context.getBean(prototypeDog,Dog.class);return contextDog:contexDog ,br/ autowiredDog:prototypeDog;}RequestMapping(/request)public String request(){//从context获取对象Dog contexDog context.getBean(requestDog,Dog.class);return contextDog:contexDog ,br/ autowiredDog:requestDog;}RequestMapping(/session)public String session(){//从context获取对象Dog contexDog context.getBean(sessionDog,Dog.class);return contextDog:contexDog ,br/ autowiredDog:sessionDog;}RequestMapping(/application)public String application(){//从context获取对象Dog contexDog context.getBean(applicationDog,Dog.class);return contextDog:contexDog ,br/ autowiredDog:applicationDog;} }这里需要注意的是autowired直接注入是在spring容器启动时就进行注入Applicationcontext获取容器注入是每次请求才注入对象 所以具体的请求情况如下所示 对于单列来说对象是共享的所以注入的对象地址两个都是一样的 对于原型作用域 由于每次请求使用bean时都会创建新的实例所以多次请求会进行变化spring启动时就已经注入所以不会进行变化除非重启服务 对于请求作用域 因为每次请求都会重新创建实例所以不断刷新后对象地址就会进行改变 对于会话作用域: 对于会话作用域范围比请求作用域更加广泛在一个浏览器上算是一个会话如果要进行改变对象地址就得重新开启一个会话那么可以使用两个浏览器进行url的请求访问那么此时不同浏览器的对象地址就是不一样的 最后一个应用作用域小编就不再进行演示了结果和单例一样 Application scope就是对于整个web容器来说, bean的作域是ServletContext级别的. 这个和 singleton有点类似区别在于: Application scope是ServletContext的单例, singleton是个 ApplicationContext的单例. 在个web容器中ApplicationContext可以有多个 **??**2.Bean的生命周期 ??2.1概念以及分类 命周期指的是个对象从诞到销毁的整个命过程, 我们把这个过程就叫做个对象的命周期. Bean 的命周期分为以下5个部分: 1. 实例化(为Bean分配内存空间) 2. 属性赋值(Bean注和装配, 如 AutoWired ) 3. 初始化 a. 执各种通知, 如 BeanNameAware , BeanFactoryAware ,ApplicationContextAware 的接口方法. b. 执初始化法 xml定义 init-method 使注解的式 PostConstruct 执初始化后置法( BeanPostProcessor ) 4. 使Bean 5. 销毁Bean ??2.2代码演示 代码如下所示 Component public class BeanLifeComponent implements BeanNameAware {public Dog singletonDog;public BeanLifeComponent() {System.out.println(执行构造函数...);}//属性注入Autowiredpublic void setSingletonDog(Dog singletonDog) {this.singletonDog singletonDog;System.out.println(执行setSingletonDog....);}//执行各种通知Overridepublic void setBeanName(String name) {System.out.println(setBeanName: name);}//初始化方法PostConstructpublic void init(){System.out.println(执行PostConstruct...);}//使用beanpublic void use(){System.out.println(执行use方法....);}//销毁beanPreDestroypublic void destroy(){System.out.println(执行destroy方法);} }对应就是实例化分配内存然后属性注入在进行初始化各种通知以及通过注解初始化方法最后使用bean以及销毁bean 日志打印如下 ??2.3原码阅读 首先点击进入AbstractAutowireCapableBeanFactory类查看源码内容 找到AbstractAutowireCapableBeanFactory类里createBean方法的实现 此方法主要在创建过程中会先进行一些准备工作比如解析 Bean 的类还会尝试在实例化之前进行一些处理若有合适的处理器处理并返回了 Bean 实例就直接返回若没有则调用doCreateBean方法实际创建 Bean 实例。 2.3.1解析Bean类 Class? resolvedClass this.resolveBeanClass(mbd, beanName, new Class[0]);if (resolvedClass ! null !mbd.hasBeanClass() mbd.getBeanClassName() ! null) {mbdToUse new RootBeanDefinition(mbd);mbdToUse.setBeanClass(resolvedClass);this.resolveBeanClass(mbd, beanName, new Class[0])尝试解析 Bean 定义对应的类。若解析成功且 Bean 定义里没有直接设置类同时 Bean 类名不为空就创建一个新的 RootBeanDefinition 对象 mbdToUse并把解析后的类设置进去。 2.3.2实例化前处理 try {beanInstance this.resolveBeforeInstantiation(beanName, mbdToUse);if (beanInstance ! null) {return beanInstance;}这里的resolveBeforeInstantiation会调用后至处理器的方法在执行后判断如果该实例为非空的那么直接返回这个实例不再执行下面实例化的创建过程 2.3.3创建Bean的实例 在上述解析和实例化处理后就开始执行实例的创建工作了主要的方法就是doBeanCreate; try {beanInstance this.doCreateBean(beanName, mbdToUse, args);if (this.logger.isTraceEnabled()) {this.logger.trace(Finished creating instance of bean beanName );}return beanInstance;this.doCreateBean(beanName, mbdToUse, args)调用该方法实际创建 Bean 实例这个方法包含了实例化、属性注入、初始化等一系列操作。 点开doCreateBean方法 在此方法中 这三个法与三个命周期阶段对应 1. createBeanInstance() - 实例化 2. populateBean() - 属性赋值 3. initializeBean() - 初始化 点击进入initializeBean() 2.3.4初始化Bean initializeBean 方法的主要作用是对已经实例化的 Bean 进行初始化操作包括调用 Aware 接口方法、应用 BeanPostProcessor 前置处理、调用初始化方法以及应用 BeanPostProcessor 后置处理。这里可以对照英文单词看看 其中初始化方法如下 invokeAwareMethods 方法用于检查 Bean 是否实现了特定的 Aware 接口若实现了就判断是否实现了特定的子接口例如实现了BeanNameAware接口调用相应的 setter 方法将相关信息注入到 Bean 中。 大致的思维导图就是 **??**3.总结 本期主要讲解了Spring原理中的Bean的作用域以及生命周期通过概念以及相关代码进行演示最后深入源码讲解Bean的生命周期的实现过程 ???~~~~最后希望与诸君共勉共同进步 ???以上就是本期内容了 感兴趣的话就关注小编吧。 ???期待你的关注~~~
http://www.hkea.cn/news/14402725/

相关文章:

  • 汽修厂做网站有什么好处网页模板下载后怎么用
  • 彩票网站开发.极云惠州城乡住房建设厅网站
  • 网站后台验证码出不来濮阳微信网站建设
  • 广州cms建站系统网站制作厂家有哪些
  • 旅游网站开发近五年参考文献dz wordpress互通
  • 监控企业网站模板给我看电影全集
  • 中通服建设有限公司网站优秀网页 网站
  • 番禺做网站的公司网站制作建设是做什么
  • 网站建设需要哪些知识潍坊最新消息
  • 建设官方网站怎么登录python爬虫做网站
  • 广西南宁公司网站制作wordpress 多形式
  • 西安晨曦e动网站建设域名查询中心官网
  • 中国工程建设工程造价管理协会网站单位做网站支出应怎么核算
  • 我要建立网站网站运营内容包含哪些
  • 网站建设浦东微博营销案例有哪些
  • 沈阳有多少网站外贸网站建设的重要性
  • 郑州专业建网站广州网站建设 易企建站
  • 精能集团有限公司两学一做网站英文网站模版
  • 外包公司做网站有哪些内容互联网排名前十的公司2021
  • 如何将公司网站做的更好看dw软件下载
  • 哈尔滨营销型网站建设公司北京app建设 网站开发公司
  • 台州高端网站建设土巴兔全包装修怎么样
  • 自学网站开发要多久企业邮箱注册去哪
  • 泰安中商网络做的网站怎么进入引流推广的方法
  • 阿勒泰高端网站建设公司网站以什么名字备案
  • 论坛网站怎么建设直播网站基础建设
  • 模板网站如何建站app软件下载免费
  • 怎么做百度里面自己的网站网站在只有域名了
  • mvc 门户网站开发框架贵州建设官方网站
  • 太原哪个网站制作最好用北京小程序 app开发公司