1.springbean初始化和实例化?
2.学习编程|Spring源码深度解析 读书笔记 第4章:bean的加载
3.php,jsp,aspä¸è
ä¼ç¼ºç¹...
4.å¦ä½ç解@Resourceå@Referenceçåºå«
5.Spring系列随笔1-Bean(小白入门篇)
springbean初始化和实例化?
spring配置bean实例化有哪些方式
1.实例化bean的三种方法:
(1)构造器
!--体验1--
beanid="personService"class="com.persia.PersonServiceBean"
!--index代表方法的参数序号,由0开始,基本的类型Type可以不声明--
constructor-argindex="0"value="构造注入的name"/
constructor-argindex="1"type="com.persia.IDaoBean"ref="personDao"/
/bean
对应类
publicPersonServiceBean(Stringname,IDaoBeanpersonDao){
this.name=name;
this.personDao=personDao;
}
!--体现2--
beanid="personDao"class="cn.itcast.dao.impl.PersonDaoBean"/
beanid="personServiceBean"class="cn.itcast.service.impl.PersonServiceBean"
lazy-init="true"init-method="init"destroy-method="destory"
!--ref属性对应idpersonDao值name属性对应接口的getter方法名称--
propertyname="personDao"ref="personDao"/
!--体验3--
!--注入属性值--
propertyname="name"value=""/
!--Set的注入--
propertyname="sets"
set
valuesets:第一个值/value
valuesets:第二个值/value
valuesets:第三个值/value
/set
/property
!--List的注入--
propertyname="lists"
list
valuelists:第一个值/value
valuelists:第二个值/value
valuelists:第三个值/value
/list
/property
!--Properties的注入--
propertyname="properties"
props
propkey="props-key1":第一个值/prop
propkey="props-key2":第二个值/prop
propkey="props-key3":第三个值/prop
/props
/property
!--Map的注入--
propertyname="maps"
map
entrykey="maps-key1"value=":第一个值"/
entrykey="maps-key2"value=":第二个值"/
entrykey="maps-key3"value=":第三个值"/
/map
/property
/bean
(2)静态工厂:
!--静态工厂获取bean--
beanid="personService2"class="com.persia.PersonServiceBeanFactory"factory-method="createInstance"/
对应类
publicstaticPersonServiceBeancreateInstance(){
returnnewPersonServiceBean();
}
(3)实例工厂:
没有静态方法,因此配置时,先实例化工厂,在实例化需要的授全加密源码bean。
!--实例工厂获取bean,先实例化工厂再实例化bean--
beanid="fac"class="com.persia.PersonServiceBeanInsFactory"/
beanid="personService3"factory-bean="fac"factory-method="createInstance"/
对应类
publicPersonServiceBeancreateInstance(){
returnnewPersonServiceBean();
}
2.bean的作用域
默认情况为单例方式:scope=”singleton”
singleton
单实例作用域,这是Spring容器默认的作用域,使用singleton作用域生成的是单实例,在整个Bean容器中仅保留一个实例对象供所有调用者共享引用。单例模式对于那些无会话状态的Bean(如辅助工具类、DAO组件、业务逻辑组件等)是最理想的选择。
prototype
原型模式,这是多实例作用域,针对每次不同的请求,Bean容器均会生成一个全新的Bean实例以供调用者使用。prototype作用域非常适用于那些需要保持会话状态的Bean实例,有一点值得注意的就是,Spring不能对一个prototype
Bean的整个生命周期负责,容器在初始化、装配好一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。因此,客户端要负责prototype实例的生命周期管理。
request
针对每次HTTP请求,Spring容器会根据Bean的定义创建一个全新的Bean实例,
且该Bean实例仅在当前HTTPrequest内有效,因此可以根据需要放心地更改所建实例的内部状态,
而其他请求中根据Bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。
当处理请求结束,s7200源码request作用域的Bean实例将被销毁。该作用域仅在基于web的Spring
ApplicationContext情形下有效。
session
针对某个HTTP
Session,Spring容器会根据Bean定义创建一个全新的Bean实例,且该Bean实例仅在当前HTTPSession内有效。
与request作用域一样,我们可以根据需要放心地更改所创建实例的内部状态,而别的HTTPSession中根据Bean定义创建的实例,
将不会看到这些特定于某个HTTPSession的状态变化。当HTTPSession最终被废弃的时候,在该HTTP
Session作用域内的Bean实例也会被废弃掉。该作用域仅在基于Web的SpringApplicationContext情形下有效。
globalsession
global
session作用域类似于标准的HTTP
Session作用域,不过它仅仅在基于portlet的Web应用中才有意义。portlet规范定义了全局Session的概念,它被所有构成某个portlet
Web应用的各种不同的portlet所共享。在globalsession作用域中定义的Bean被限定于全局portlet
Session的生命周期范围内。如果我们是在编写一个标准的基于Servlet的Web应用,并且定义了一个或多个具有global
session作用域的Bean,系统会使用标准的HTTPSession作用域,并且不会引起任何错误。该作用域仅在基于Web的Spring
ApplicationContext情形下有效。
3.bean的生命周期
(1)什么时候实例化?
对于单例的形式,在容器实例化的时候对bean进行实例化的。
ApplicationContextctx=newClassPathXmlApplicationContext(newString[]{ "applicationContext.xml"});
单实例可以通过lazy-init=”true”,在getBean时进行实例化。
在beans里面default-lazy-init=”true”对所有bean进行延迟处理。
对于prototype,则是在getBean的时候被实例化的。
(2)在bean被实例化之后执行资源操作等方法:
Init-method=””
(3)在bean销毁之前执行的方法:
Destroy-method=””
什么时候被销毁?随着spring容器被关闭时被销毁。
调用spring容器的close方法来正常关闭。以前是随着应用程序执行完而关闭。
在Spring装载配置文件后,php 打印 照片 源码Spring工厂实例化完成,开始处理
(1)使用默认构造方法或指定构造参数进行Bean实例化。
(2)根据property标签的配置调用Bean实例中的相关set方法完成属性的赋值。
(3)如果Bean实现了BeanNameAware接口,则调用setBeanName()方法传入当前Bean的ID。
(4)如果Bean实现了BeanFactoryAware接口,则调用setBeanFactory()方法传入当前工厂实例的引用。
(5)如果Bean实现了ApplicationContextAware接口,则调用setApplicationContext()方法传入当前ApplicationContext实例的引用。
(6)如果有BeanPostProcessor与当前Bean关联,则与之关联的对象的postProcess-BeforeInitialzation()方法将被调用。
(7)如果在配置文件中配置Bean时设置了init-method属性,则调用该属性指定的初始化方法。
(8)如果有BeanPostProcessor与当前Bean关联,则与之关联的对象的postProcess-AfterInitialzation()方法将被调用。
(9)Bean实例化完成,处于待用状态,可以被正常使用了。
()当Spring容器关闭时,如果Bean实现了DisposableBean接口,则destroy()方法将被调用。
()如果在配置文件中配置Bean时设置了destroy-method属性,则调用该属性指定的方法进行销毁前的一些处理。
()Bean实例被正常销毁。
Spring系列(一)SpringMVCbean解析、注册、实例化流程源码剖析
最近在使用SpringMVC过程中遇到了一些问题,网上搜索不少帖子后虽然找到了答案和解决方法,但这些答案大部分都只是给了结论,并没有说明具体原因,感觉总是有点不太满意。
更重要的是这些所谓的结论大多是抄来抄去,基本源自一家,订单管理后台源码真实性也有待考证。
那作为程序员怎么能知其所以然呢?
此处请大家内心默读三遍。
用过Spring的人都知道其核心就是IOC和AOP,因此要想了解Spring机制就得先从这两点入手,本文主要通过对IOC部分的机制进行介绍。
在开始阅读之前,先准备好以下实验材料。
IDEA是一个优秀的开发工具,如果还在用Eclipse的建议切换到此工具进行。
IDEA有很多的快捷键,在分析过程中建议大家多用Ctrl+Alt+B快捷键,可以快速定位到实现函数。
Springbean的加载主要分为以下6步:
查看源码第一步是找到程序入口,再以入口为突破口,一步步进行源码跟踪。
JavaWeb应用中的入口就是web.xml。
在web.xml找到ContextLoaderListener,此Listener负责初始化SpringIOC。
contextConfigLocation参数设置了bean定义文件地址。
下面是ContextLoaderListener的官方定义:
翻译过来ContextLoaderListener作用就是负责启动和关闭SpringrootWebApplicationContext。
具体WebApplicationContext是什么?开始看源码。
从源码看出此Listener主要有两个函数,一个负责初始化WebApplicationContext,一个负责销毁。
继续看initWebApplicationContext函数。
在上面的代码中主要有两个功能:
进入CreateWebAPPlicationContext函数
进入determineContextClass函数。
进入configureAndReFreshWebApplicaitonContext函数。
WebApplicationContext有很多实现类。但从上面determineContextClass得知此处wac实际上是XmlWebApplicationContext类,因此进入XmlWebApplication类查看其继承的refresh()方法。
沿方法调用栈一层层看下去。
获取beanFactory。
beanFactory初始化。股票公式的源码
加载bean。
读取XML配置文件。
XmlBeanDefinitionReader读取XML文件中的bean定义。
继续查看loadBeanDefinitons函数调用栈,进入到XmlBeanDefinitioReader类的loadBeanDefinitions方法。
最终将XML文件解析成Document文档对象。
上一步完成了XML文件的解析工作,接下来将XML中定义的bean注册到webApplicationContext,继续跟踪函数。
用BeanDefinitionDocumentReader对象来注册bean。
解析XML文档。
循环解析XML文档中的每个元素。
下面是默认命名空间的解析逻辑。
不明白Spring的命名空间的可以网上查一下,其实类似于package,用来区分变量来源,防止变量重名。
这里我们就不一一跟踪,以解析bean元素为例继续展开。
解析bean元素,最后把每个bean解析为一个包含bean所有信息的BeanDefinitionHolder对象。
接下来将解析到的bean注册到webApplicationContext中。接下继续跟踪registerBeanDefinition函数。
跟踪registerBeanDefinition函数,此函数将bean信息保存到到webApplicationContext的beanDefinitionMap变量中,该变量为map类型,保存Spring容器中所有的bean定义。
Spring实例化bean的时机有两个。
一个是容器启动时候,另一个是真正调用的时候。
相信用过Spring的同学们都知道以上概念,但是为什么呢?
继续从源码角度进行分析,回到之前XmlWebApplication的refresh()方法。
可以看到获得beanFactory后调用了finishBeanFactoryInitialization()方法,继续跟踪此方法。
预先实例化单例类逻辑。
获取bean。
doGetBean中处理的逻辑很多,为了减少干扰,下面只显示了创建bean的函数调用栈。
创建bean。
判断哪种动态代理方式实例化bean。
不管哪种方式最终都是通过反射的形式完成了bean的实例化。
我们继续回到doGetBean函数,分析获取bean的逻辑。
上面方法中首先调用getSingleton(beanName)方法来获取单例bean,如果获取到则直接返回该bean。方法调用栈如下:
getSingleton方法先从singletonObjects属性中获取bean对象,如果不为空则返回该对象,否则返回null。
那singletonObjects保存的是什么?什么时候保存的呢?
回到doGetBean()函数继续分析。如果singletonObjects没有该bean的对象,进入到创建bean的逻辑。处理逻辑如下:
下面是判断容器中有没有注册bean的逻辑,此处beanDefinitionMap相信大家都不陌生,在注册bean的流程里已经说过所有的bean信息都会保存到该变量中。
如果该容器中已经注册过bean,继续往下走。先获取该bean的依赖bean,如果镩子依赖bean,则先递归获取相应的依赖bean。
依赖bean创建完成后,接下来就是创建自身bean实例了。
获取bean实例的处理逻辑有三种,即Singleton、Prototype、其它(request、session、globalsession),下面一一说明。
如果bean是单例模式,执行此逻辑。
获取单例bean,如果已经有该bean的对象直接返回。如果没有则创建单例bean对象,并添加到容器的singletonObjectsMap中,以后直接从singletonObjects直接获取bean。
把新生成的单例bean加入到类型为MAP的singletonObjects属性中,这也就是前面singletonObjects()方法中获取单例bean时从此Map中获取的原因。
Prototype是每次获取该bean时候都新建一个bean,因此逻辑比较简单,直接创建一个bean后返回。
从相应scope获取对象实例。
判断scope,获取实例函数逻辑。
在相应scope中设置实例函数逻辑。
以上就是Springbean从无到有的整个逻辑。
从源码角度分析bean的实例化流程到此基本接近尾声了。
回到开头的问题,ContextLoaderListener中初始化的WebApplicationContext到底是什么呢?
通过源码的分析我们知道WebApplicationContext负责了bean的创建、保存、获取。其实也就是我们平时所说的IOC容器,只不过名字表述不同而已。
本文主要是讲解了XML配置文件中bean的解析、注册、实例化。对于其它命名空间的解析还没有讲到,后续的文章中会一一介绍。
希望通过本文让大家在以后使用Spring的过程中有“一切尽在掌控之中”的感觉,而不仅仅是稀里糊涂的使用。
SpringBean的初始化本文基于上一篇文章进行续写
上一篇文章地址:SpringBean实例化及构造器选择
1.BeanPostProcessor
查看源码发现BeanPostProcessor提供了两个初始化前后的方法,新建一个接口并重写该接口的这两个方法
1.新建一个InstantiationAwareBeanPostProcessorSpring方法并实现InstantiationAwareBeanPostProcessor接口
InstantiationAwareBeanPostProcessor实现了BeanPostProcessor,所以此处使用InstantiationAwareBeanPostProcessorSpring也可以调用上述2个接口方法
2.UserService类实现InitializingBean接口,并重写afterPropertiesSet方法
3.利用客户端进行调用
4.运行结果
spring的bean到底在什么时候实例化spring的bean在被依赖的时候实例化;
分为以下几种Bean:
1.如果指定的是convertrService,beanPostProcessor等实例的时候,则会在ApplicationContext初始化的时候就实例化;
2.如果指定的是自定义的Bean,那么会在第一次访问的时候实例化;
[被依赖的时候实例化,更明确的说是第一次访问]
springioc容器之Bean实例化和依赖注入 spring中的bean对象和java对象是有些许差别的,spring中的bean包含了java对象,并且是基于java对象在spring中做了一些列的加工,所以说spring中的bean比java对象更加丰富。在spring中bean的实例化有2个时机:下面从springioc容器初始化的时候,预实例化的bean为线索来追溯bean的实例化和依赖注入过程,这个过程涵盖了getBean方法。在springioc容器初始化的时候,触发了所有预实例化的bean的加载,这里必须是非抽象、单例和非懒加载的bean才符合条件进行预实例化。具体bean的实例化是在getBean方法中。这里通过getSingleton先从缓存中获取bean实例。从缓存中获取很好理解,分别从spring容器的一级缓存singletonObjects、二级缓存earlySingletonObjects和三级缓存singletonFactories中获取bean实例。在初次获取bean的时候,这里的缓存肯定为空的,但是对于存在循环依赖的bean,这里的一级或二级缓存就不是空的。在有循环依赖的bean中,这里一级缓存会存在不为空的情况,这个时候通过singletonFactory.getObject的时候,返回的可能是一个bean实例,也有可能是一个提前进行aop的代理对象(正常情况下aop是发生在bean初始化的时候完成的),对于有循环依赖并且需要进行aop的bean,在这里会进行提前aop代理对象的生成。当缓存中没有找到bean实例的时候:通过singletonFactory.g学习编程|Spring源码深度解析 读书笔记 第4章:bean的加载
在Spring框架中,bean的加载过程是一个精细且有序的过程。首先,当需要加载bean时,Spring会尝试通过转换beanName来识别目标对象,可能涉及到别名或FactoryBean的识别。
加载过程分为几步:从缓存查找单例,Spring容器内单例只创建一次,若缓存中无数据,会尝试从singletonFactories寻找。接着是bean的实例化,从缓存获取原始状态后,可能需要进一步处理以符合预期状态。
原型模式的依赖检查是单例模式特有的,用来避免循环依赖问题。然后,如果缓存中无数据,会检查parentBeanFactory,递归加载配置。BeanDefinition会被转换为RootBeanDefinition,合并父类属性,确保依赖的正确初始化。
Spring根据不同的scope策略创建bean,如singleton、prototype等。类型转换是后续步骤,可能将返回的bean转换为所需的类型。FactoryBean的使用提供了灵活的实例化逻辑,用户自定义创建bean的过程。
当bean为FactoryBean时,getBean()方法代理了FactoryBean的getObject(),允许通过不同的方式配置bean。缓存中获取单例时,会执行循环依赖检测和性能优化。最后,通过ObjectFactory实例singletonFactory定义bean的完整加载逻辑,包括回调方法用于处理单例创建前后的状态。
php,jsp,aspä¸è ä¼ç¼ºç¹...
JSP ASP PHP
è¿è¡é度 å¿« è¾å¿« è¾å¿«
è¿è¡èæ è¾å° è¾å¤§ è¾å¤§
é¾æç¨åº¦ 容æææ¡ ç®å ç®å
è¿è¡å¹³å° ç»å¤§é¨åå¹³å°åå¯ Windowså¹³å° Windows/UNIXå¹³å°
æ©å±æ§ 好 è¾å¥½ è¾å·®
å®å ¨æ§ 好 è¾å·® 好
å½æ°æ§ å¤ è¾å° å¤
æ°æ®åºæ¯æ å¤ å¤ å¤
ååæ¯æ å¤ è¾å° è¾å¤
对XMLçæ¯æ æ¯æ ä¸æ¯æ æ¯æ
对ç»ä»¶çæ¯æ æ¯æ æ¯æ ä¸æ¯æ
对åå¸å¼å¤ççæ¯æ æ¯æ æ¯æ ä¸æ¯æ
åºç¨ç¨åº è¾å¹¿ è¾å¹¿ è¾å¹¿
----------------------------------------------------
转载:
æ ¢æ ¢çå§!
ASPãJSPä¸PHPçæ¯è¾
ç®åï¼æ常ç¨çä¸ç§å¨æç½é¡µè¯è¨æASP(Active Server Pages),JSP(Java Server Pages),
PHP (Hypertext Preprocessor)ã
ç® ä»
ASPå ¨åActive Server Pagesï¼æ¯ä¸ä¸ªWEBæå¡å¨ç«¯çå¼åç¯å¢ï¼ å©ç¨å®å¯ä»¥äº§çåè¿
è¡å¨æçã交äºçãé«æ§è½çWEBæå¡åºç¨ç¨åºãASPéç¨èæ¬è¯è¨VB Scriptï¼Java script
ï¼ä½ä¸ºèªå·±çå¼åè¯è¨ã
PHPæ¯ä¸ç§è·¨å¹³å°çæå¡å¨ç«¯çåµå ¥å¼èæ¬è¯è¨. å®å¤§éå°åç¨C,JavaåPerlè¯è¨çè¯æ³
, 并è¦åPHPèªå·±çç¹æ§,使WEBå¼åè è½å¤å¿«éå°ååºå¨æçæ页é¢.å®æ¯æç®åç»å¤§å¤æ°æ°
æ®åºãè¿æä¸ç¹ï¼PHPæ¯å®å ¨å è´¹çï¼ä¸ç¨è±é±ï¼ä½ å¯ä»¥ä»PHPå®æ¹ç«ç¹(
t)èªç±ä¸è½½ãèä¸ä½ å¯ä»¥ä¸åéå¶å°è·å¾æºç ï¼çè³å¯ä»¥ä»ä¸å è¿ä½ èªå·±éè¦çç¹è²ã
JSP æ¯Sunå ¬å¸æ¨åºçæ°ä¸ä»£ç«ç¹å¼åè¯è¨ï¼ä»å®å ¨è§£å³äºç®åASP,PHPçä¸ä¸ªéç ï¼ï¼
èæ¬çº§æ§è¡ï¼æ®è¯´PHP4 ä¹å·²ç»å¨Zend çæ¯æä¸ï¼å®ç°ç¼è¯è¿è¡ï¼.Sun å ¬å¸åå©èªå·±å¨Jav
a ä¸çä¸å¡é 诣ï¼å°Java ä»Java åºç¨ç¨åº å Java Applet ä¹å¤ï¼åææ°çç¡æï¼å°±æ¯Js
pï¼ï¼Java Server PageãJsp å¯ä»¥å¨ServerletåJavaBeançæ¯æä¸ï¼å®æåè½å¼ºå¤§çç«ç¹
ç¨åºã
ä¸è é½æä¾å¨ HTML 代ç ä¸æ··åæç§ç¨åºä»£ç ãç±è¯è¨å¼æ解éæ§è¡ç¨åºä»£ç çè½åã
ä½JSP代ç 被ç¼è¯æ Servlet å¹¶ç± Java èææºè§£éæ§è¡ï¼è¿ç§ç¼è¯æä½ä» å¨å¯¹ JSP 页é¢ç
第ä¸æ¬¡è¯·æ±æ¶åçãå¨ ASP ãPHPãJSP ç¯å¢ä¸ï¼ HTML 代ç 主è¦è´è´£æè¿°ä¿¡æ¯çæ¾ç¤ºæ ·å¼
ï¼èç¨åºä»£ç åç¨æ¥æè¿°å¤çé»è¾ãæ®éç HTML 页é¢åªä¾èµäº Web æå¡å¨ï¼è ASP ãPH
PãJSP 页é¢éè¦éå çè¯è¨å¼æåæåæ§è¡ç¨åºä»£ç ãç¨åºä»£ç çæ§è¡ç»æ被éæ°åµå ¥å°
HTML 代ç ä¸ï¼ç¶åä¸èµ·åéç»æµè§å¨ã ASP ãPHPã JSPä¸è é½æ¯é¢å Web æå¡å¨çææ¯
ï¼å®¢æ·ç«¯æµè§å¨ä¸éè¦ä»»ä½éå ç软件æ¯æã
ææ¯ç¹ç¹
ASP:
1. ä½¿ç¨ VBScript ã JScript çç®åææçèæ¬è¯è¨ï¼ç»å HTML 代ç ï¼å³å¯å¿«éå°å®æ
ç½ç«çåºç¨ç¨åºã
2. æ é¡» compile ç¼è¯ï¼å®¹æç¼åï¼å¯å¨æå¡å¨ç«¯ç´æ¥æ§è¡ã
3. 使ç¨æ®éçææ¬ç¼è¾å¨ï¼å¦ Windows çè®°äºæ¬ï¼å³å¯è¿è¡ç¼è¾è®¾è®¡ã
4. ä¸æµè§å¨æ å ³ (Browser Independence), ç¨æ·ç«¯åªè¦ä½¿ç¨å¯æ§è¡ HTML ç çæµè§å¨ï¼å³
å¯æµè§ Active Server Pages æ设计çç½é¡µå 容ã Active Server Pages æ使ç¨çèæ¬è¯
è¨ (VBScript ã Jscript) åå¨ WEB æå¡å¨ç«¯æ§è¡ï¼ç¨æ·ç«¯çæµè§å¨ä¸éè¦è½å¤æ§è¡è¿äº
èæ¬è¯è¨ã
5.Active Server Pages è½ä¸ä»»ä½ ActiveX scripting è¯è¨ç¸å®¹ãé¤äºå¯ä½¿ç¨ VBScript
æ JScript è¯è¨æ¥è®¾è®¡å¤ï¼è¿éè¿ plugï¼in çæ¹å¼ï¼ä½¿ç¨ç±ç¬¬ä¸æ¹ææä¾çå ¶ä»èæ¬è¯è¨
ï¼è¬å¦ REXX ã Perl ã Tcl çãèæ¬å¼ææ¯å¤çèæ¬ç¨åºç COM(Component Object Mod
el) ç©ä»¶ã
6. å¯ä½¿ç¨æå¡å¨ç«¯çèæ¬æ¥äº§ç客æ·ç«¯çèæ¬ã
7.ActiveX Server Components(ActiveX æå¡å¨å 件 ) å ·ææ éå¯æ©å æ§ãå¯ä»¥ä½¿ç¨ Vi
sual Basic ã Java ã Visual Cï¼ï¼ ã COBOL çç¼ç¨è¯è¨æ¥ç¼åä½ æéè¦çActiveX Se
rver Component ã
PHP:
1ï¼æ°æ®åºè¿æ¥
PHPå¯ä»¥ç¼è¯æå ·æä¸è®¸å¤æ°æ®åºç¸è¿æ¥çå½æ°ãPHPä¸MySQLæ¯ç°å¨ç»ä½³çç»åãä½ è¿å¯
以èªå·±ç¼åå¤å´çå½æ°åé´æ¥ååæ°æ®åºãéè¿è¿æ ·çéå¾å½ä½ æ´æ¢ä½¿ç¨çæ°æ®åºæ¶ï¼å¯ä»¥
è½»æ¾å°æ´æ¹ç¼ç 以éåºè¿æ ·çåãPHPLIBå°±æ¯æ常ç¨çå¯ä»¥æä¾ä¸è¬äºå¡éè¦çä¸ç³»ååºåº
ãä½PHPæä¾çæ°æ®åºæ¥å£æ¯æå½¼æ¤ä¸ç»ä¸ï¼æ¯å¦å¯¹Oracle, MySQLï¼ Sybaseçæ¥å£ï¼å½¼æ¤
é½ä¸ä¸æ ·ãè¿ä¹æ¯PHPçä¸ä¸ªå¼±ç¹ã
2ï¼é¢å对象ç¼ç¨
PHPæä¾äºç±»å对象ãåºäºwebçç¼ç¨å·¥ä½é常éè¦é¢å对象ç¼ç¨è½åãPHPæ¯ææé å¨ã
æåç±»çã
JSP:
1ï¼å°å 容ççæåæ¾ç¤ºè¿è¡å离
使ç¨JSPææ¯ï¼Web页é¢å¼å人åå¯ä»¥ä½¿ç¨HTMLæè XMLæ è¯æ¥è®¾è®¡åæ ¼å¼åæç»é¡µé¢ã使
ç¨JSPæ è¯æè å°èæ¬æ¥çæ页é¢ä¸çå¨æå 容ãçæå 容çé»è¾è¢«å°è£ å¨æ è¯åJavaBeans
ç»ä»¶ä¸ï¼å¹¶ä¸æç»å¨å°èæ¬ä¸ï¼ææçèæ¬å¨æå¡å¨ç«¯è¿è¡ãå¦ææ ¸å¿é»è¾è¢«å°è£ å¨æ è¯å
Beansä¸ï¼é£ä¹å ¶ä»äººï¼å¦Web管ç人åå页é¢è®¾è®¡è ï¼è½å¤ç¼è¾å使ç¨JSP页é¢ï¼èä¸å½±åå
容ççæã
å¨æå¡å¨ç«¯ï¼JSPå¼æ解éJSPæ è¯åå°èæ¬ï¼çææ请æ±çå 容ï¼ä¾å¦ï¼éè¿è®¿é®Java
Beansç»ä»¶ï¼ä½¿ç¨JDBCTMææ¯è®¿é®æ°æ®åºï¼æè å å«æ件ï¼ï¼å¹¶ä¸å°ç»æ以HTMLï¼æè XMLï¼
页é¢çå½¢å¼åéåæµè§å¨ãè¿æå©äºä½è ä¿æ¤èªå·±ç代ç ï¼èåä¿è¯ä»»ä½åºäºHTMLçWebæµè§
å¨çå®å ¨å¯ç¨æ§ã
2ï¼å¼ºè°å¯éç¨çç»ä»¶
ç»å¤§å¤æ°JSP页é¢ä¾èµäºå¯éç¨çï¼è·¨å¹³å°çç»ä»¶ï¼JavaBeansæè Enterprise JavaBea
nsTMç»ä»¶ï¼æ¥æ§è¡åºç¨ç¨åºæè¦æ±çæ´ä¸ºå¤æçå¤çãå¼å人åè½å¤å ±äº«å交æ¢æ§è¡æ®éæ
ä½çç»ä»¶ï¼æè 使å¾è¿äºç»ä»¶ä¸ºæ´å¤ç使ç¨è æè 客æ·å¢ä½æ使ç¨ãåºäºç»ä»¶çæ¹æ³å éäº
æ»ä½å¼åè¿ç¨ï¼å¹¶ä¸ä½¿å¾åç§ç»ç»å¨ä»ä»¬ç°æçæè½åä¼åç»æçå¼ååªåä¸å¾å°å¹³è¡¡ã
3ï¼éç¨æ è¯ç®å页é¢å¼å
Web页é¢å¼å人åä¸ä¼é½æ¯çæèæ¬è¯è¨çç¼ç¨äººåãJavaServer Pageææ¯å°è£ äºè®¸å¤
åè½ï¼è¿äºåè½æ¯å¨æç¨çãä¸JSPç¸å ³çXMLæ è¯ä¸è¿è¡å¨æå 容çææéè¦çãæ åçJS
Pæ è¯è½å¤è®¿é®åå®ä¾åJavaBeansç»ä»¶ï¼è®¾ç½®æè æ£ç´¢ç»ä»¶å±æ§ï¼ä¸è½½Appletï¼ä»¥åæ§è¡ç¨
å ¶ä»æ¹æ³æ´é¾äºç¼ç åèæ¶çåè½ã
éè¿å¼åå®å¶åæ è¯åºï¼JSPææ¯æ¯å¯ä»¥æ©å±çãä»åï¼ç¬¬ä¸æ¹å¼å人ååå ¶ä»äººåå¯ä»¥
为常ç¨åè½å建èªå·±çæ è¯åºãè¿ä½¿å¾Web页é¢å¼å人åè½å¤ä½¿ç¨çæçå·¥å ·åå¦åæ è¯ä¸æ ·
çæ§è¡ç¹å®åè½çæ件æ¥å·¥ä½ã
JSPææ¯å¾å®¹ææ´åå°å¤ç§åºç¨ä½ç³»ç»æä¸ï¼ä»¥å©ç¨ç°åçå·¥å ·åæå·§ï¼å¹¶ä¸æ©å±å°è½å¤
æ¯æä¼ä¸çº§çåå¸å¼åºç¨ãä½ä¸ºéç¨Javaææ¯å®¶æçä¸é¨åï¼ä»¥åJava 2ï¼ä¼ä¸çä½ç³»ç»æ
ï¼çä¸ä¸ªç»æé¨åï¼JSPææ¯è½å¤æ¯æé«åº¦å¤æçåºäºWebçåºç¨ã
ç±äºJSP页é¢çå ç½®èæ¬è¯è¨æ¯åºäºJavaç¼ç¨è¯è¨çï¼èä¸ææçJSP页é¢é½è¢«ç¼è¯æ为
Java Servletï¼JSP页é¢å°±å ·æJavaææ¯çææ好å¤ï¼å æ¬å¥å£®çåå¨ç®¡çåå®å ¨æ§ã
ä½ä¸ºJavaå¹³å°çä¸é¨åï¼JSPæ¥æJavaç¼ç¨è¯è¨âä¸æ¬¡ç¼åï¼åå¤è¿è¡âçç¹ç¹ãéçè¶
æ¥è¶å¤çä¾åºåå°JSPæ¯ææ·»å å°ä»ä»¬ç产åä¸ï¼æ¨å¯ä»¥ä½¿ç¨èªå·±æéæ©çæå¡å¨åå·¥å ·ï¼æ´
æ¹å·¥å ·ææå¡å¨å¹¶ä¸å½±åå½åçåºç¨ã
åºç¨èå´
ASPæ¯Microsoftå¼åçå¨æç½é¡µè¯è¨ï¼ä¹ç»§æ¿äºå¾®è½¯äº§åçä¸è´¯ä¼ ç»ââåªè½è¿è¡äºå¾®è½¯
çæå¡å¨äº§å,IIS (Internet Information Server) (windows NT)åPWS(Personal Web Se
rver)(windows )ä¸ãUnixä¸ä¹æChiliSoftçæ件æ¥æ¯æASPï¼ä½æ¯ASPæ¬èº«çåè½æéï¼
å¿ é¡»éè¿ASPï¼COMçç»åæ¥æ©å ï¼Unixä¸çCOMå®ç°èµ·æ¥é常å°é¾ã
PHP3å¯å¨Windows,Unix,LinuxçWebæå¡å¨ä¸æ£å¸¸è¿è¡,è¿æ¯æIIS,Apacheçéç¨Webæå¡å¨
,ç¨æ·æ´æ¢å¹³å°æ¶,æ éåæ¢PHP3代ç ,å¯å³æ¿å³ç¨.
JSPåPHP3类似ï¼å ä¹å¯ä»¥è¿è¡äºææå¹³å°ãå¦Win NT,Linux,Unix. NTä¸IISéè¿ä¸ä¸ªæ
件ï¼ä¾å¦JRUNæè ServletExecï¼å°±è½æ¯æJSPãèåçWebæå¡å¨Apacheå·²ç»è½å¤æ¯æJSPã
ç±äºApache广æ³åºç¨å¨NTãUnixåLinuxä¸ï¼å æ¤JSPææ´å¹¿æ³çè¿è¡å¹³å°ãè½ç¶ç°å¨NTæä½
ç³»ç»å äºå¾å¤§çå¸åºä»½é¢ï¼ä½æ¯å¨æå¡å¨æ¹é¢Unixçä¼å¿ä»ç¶å¾å¤§ï¼èæ°å´èµ·çLinuxæ´æ¯æ¥
å¿ä¸å°ãä»ä¸ä¸ªå¹³å°ç§»æ¤å°å¦å¤ä¸ä¸ªå¹³å°ï¼JSPåJavaBeançè³ä¸ç¨éæ°ç¼è¯ï¼å 为Javaåè
ç é½æ¯æ åçä¸å¹³å°æ å ³çã
æ§è½æ¯è¾
æ人åè¿è¯éªï¼å¯¹è¿ä¸ç§è¯è¨åå«å循ç¯æ§è½æµè¯åååOracleæ°æ®åºæµè¯ã
å¨å¾ªç¯æ§è½æµè¯ä¸ï¼JSPåªç¨äºä»¤äººåæçåç§éå°±ç»æäºï¼ç循ç¯ãèASP
ãPHPæµè¯çæ¯ï¼å¾ªç¯ï¼å°ä¸ä¸ªæ°é级ï¼ï¼å´åå«ç¨äºç§åç§ãï¼åèPHPLIBï¼
ã
æ°æ®åºæµè¯ä¸ï¼ä¸è åå«å¯¹ Oracle 8 è¿è¡ 次 Insert,Update,Select,åDelete
ï¼ Jsp éè¦ ç§ï¼Php éè¦ ç§ï¼ASPå éè¦ ç§ã
åæ¯åæ
ç®åå¨å½å PHPä¸ASPåºç¨æ为广æ³ãèJSPç±äºæ¯ä¸ç§è¾æ°çææ¯ï¼å½å éç¨çè¾å°ãä½å¨
å½å¤ï¼JSPå·²ç»æ¯æ¯è¾æµè¡çä¸ç§ææ¯ï¼å°¤å ¶æ¯çµååå¡ç±»çç½ç«ï¼å¤éç¨JSPã
éç¨PHPçç½ç«å¦æ°æµªç½ï¼sinaï¼ãä¸å½äººï¼Chinarenï¼ç,ä½ç±äºPHPæ¬èº«åå¨çä¸äºç¼º
ç¹ï¼ä½¿å¾å®ä¸éååºç¨äºå¤§åçµååå¡ç«ç¹ï¼èæ´éåä¸äºå°åçåä¸ç«ç¹ã
é¦å ï¼PHP缺ä¹è§æ¨¡æ¯æãå ¶æ¬¡ï¼ç¼ºä¹å¤å±ç»ææ¯æã对äºå¤§è´è·ç«ç¹ï¼è§£å³æ¹æ³åªæä¸
个ï¼åå¸è®¡ç®ãæ°æ®åºãåºç¨é»è¾å±ã表示é»è¾å±å½¼æ¤åå¼ï¼èä¸åå±ä¹å¯ä»¥æ ¹æ®æµéåå¼
ï¼ç»æäºç»´éµåãèPHPå缺ä¹è¿ç§æ¯æãè¿æä¸é¢æå°è¿çä¸ç¹ï¼PHPæä¾çæ°æ®åºæ¥å£æ¯
æä¸ç»ä¸ï¼è¿å°±ä½¿å¾å®ä¸éåè¿ç¨å¨çµååå¡ä¸ã
ASPåJSPå没æ以ä¸ç¼ºé·ï¼ASPå¯ä»¥éè¿Microsoft WindowsdçCOM/DCOMè·å¾ActiveXè§
模æ¯æï¼éè¿DCOMåTranscation Serverè·å¾ç»ææ¯æï¼JSPå¯ä»¥éè¿SUN JavaçJava Clas
såEJBè·å¾è§æ¨¡æ¯æï¼éè¿EJB/CORBA以åä¼å¤ååçApplication Serverè·å¾ç»ææ¯æã
ä¸è ä¸ï¼JSPåºè¯¥æ¯æªæ¥åå±çè¶å¿ãä¸çä¸ä¸äºå¤§ççµååå¡è§£å³æ¹æ¡æä¾åé½éç¨J
SP/Servletãæ¯è¾åºåçå¦IBMçEï¼businessï¼å®çæ ¸å¿æ¯éç¨JSP/ServletçWebSphereï¼
西æ¹å¦å¤ä¸ä¸ªé常èåççµååå¡è½¯ä»¶æä¾åï¼Intershopãå®åæ¥ç产åIntershop1 2, 3
, 4å æ®äºä¸»è¦ççµååå¡è½¯ä»¶ä»½é¢ãå®ä»¬é½æ¯éè¿CGIæ¥æä¾æ¯æ çãä½å»å¹´æåå®æ¨åº
äºEnfinityï¼ä¸ä¸ªéç¨JSP/Servletççµååå¡Application Serverï¼èä¸å£°è¨ä¸åå¼åä¼ ç»
软件ã
æ»ä¹
ASPï¼PHP,JSPä¸è é½æç¸å½æ°éçæ¯æè ï¼ç±æ¤ä¹å¯ä»¥çåºä¸è åææé¿ãæ£å¨å¦ä¹ æ
使ç¨å¨æ页é¢çæåå¯æ ¹æ®ä¸è çç¹ç¹éæ©ä¸ç§éåèªå·±çè¯è¨ã
å¦ä½ç解@Resourceå@Referenceçåºå«
1ï¼å®ä¹ï¼
@Resourceï¼springç注解ï¼ä½ç¨ï¼springä¸è·åå·²ç»æ³¨å ¥å°springä¸çBean
@Reference: dubboç注解ï¼ä½ç¨ï¼æ³¨å ¥dubooæå¡ç对象
2ï¼éå°é®é¢ï¼
æ¬å°é ç½®ï¼
æ¥éï¼No provider available from registry **** for service ------------
åï¼ç»å ¸æ¥éï¼ä¸çé误就以为æ¯ç产è 没æå¯å¨å½ï¼å»zkä¸é¢çdubboç产è æ åµï¼çç没æï¼é®é¢å¥½åå·²ç»æ¾å°äºï¼ï¼ççï¼å¿½ç¶åç°ä»ä¸ºä»ä¹å»çæ¯ registry 1å¢ï¼ä¸åºè¯¥å»1å2é½æ¾åï¼ å¯¹äºï¼@Reference 注ådubboä¸ç®¡æ¯ä»ä¹æ¹å¼ï¼æ éæ¯registry å versionçæå®ï¼ç±äºæ没ææå®ï¼é£æç §springçç解è¯å®æ¯èµ°èªå¨è£ é å½ï¼é£æè¿è¾¹é ç½®äºä¸¤ä¸ªæ³¨åä¸å¿ï¼æ¯ä¸æ¯ä»ä¼æºè½çé½æ¾æ¾å¢ï¼ï¼ä¸æ¯çï¼dubboç产è å¦ææå®å¤ä¸ªregistryï¼ç¶å<dubbo:service/>声æçæå¡ä¼æ³¨åå°å¤ä¸ªæ³¨åä¸å¿ï¼<dubbo:reference/>æ¶è´¹ç«¯å¤æ³¨åä¸å¿æ¶æ¯éè¦æå®å»åªä¸ªæ³¨åä¸å¿çï¼æä¸æ³å¨@Referenceåé¢åä¸å¤§å ï¼å°±æ³èµ°èªå¨åè£ é ï¼æåæ¾å°å¯ä»¥å¨registry声ææ¶ default çå±æ§çï¼
æ ¹æ®ä¸ç³»åççæµãææé ç½®æ¹ä¸ºäºï¼
èªæ¤é®é¢è§£å³äºï¼ï¼ï¼ï¼ï¼
æåç°æ°çé®é¢ï¼ä½¿ç¨@Referenceæ¥æ³¨å ¥dubboæå¡ï¼é£å¦ææ项ç®ä¸å¤ä¸ªå°æ¹æ³ä½¿ç¨ï¼æå¨å¤ä¸ªç±»ä¸ä½¿ç¨@Reference ï¼å²ä¸æ¯æ³¨å ¥å¤ä¸ªbeanäºï¼è¿ä¸ªç解æ¯æé®é¢çï¼è¿æ¶æªæè¯å°ï¼ãè¿æ¾ç¶æ¯æé®é¢çï¼å æ¤ææ³å°dubboæå¡ä»¥åä¾æ³¨å ¥å°springä¸ï¼æ¢æ springèªå·±ç@Resourceæ ç¾æ¥è·åï¼å æ¤æå°é ç½®æ¹æäºä¸ä¸ï¼
æµè¯ä¸ä¸ï¼ç¡®å®å¥½ä½¿ï¼ï¼èªæ¤é 置使ç¨æ¹é¢æ²¡ä»ä¹é®é¢äºï¼ç¬¦åä¸ä¸ªäººçæ£å¸¸é»è¾äºï¼
ä½æ¯è¿æä¸ä¸ªé®é¢ï¼å°±æ¯ï¼
âæåç°æ°çé®é¢ï¼ä½¿ç¨@Referenceæ¥æ³¨å ¥dubboæå¡ï¼é£å¦ææ项ç®ä¸å¤ä¸ªå°æ¹æ³ä½¿ç¨ï¼æå¨å¤ä¸ªç±»ä¸ä½¿ç¨@Reference ï¼å²ä¸æ¯æ³¨å ¥å¤ä¸ªbeanäº â è¿ä¸ªé®é¢ççåå¨åï¼
ä¸é¢æ¥è§£çè¿ä¸ªé®é¢ï¼
springçé ç½® ä½¿ç¨ xml æè 注解 åªæ¯ 使ç¨æ¹å¼çä¸åï¼@Reference å <dubbo:reference/> çææåºè¯¥æ¯æ¯ä¸æ ·ç, springé»è®¤æ³¨å ¥Bean,scopeåºè¯¥æ¯singleton , é£æå¨å¤ä¸ªç±»ä¸ä½¿ç¨@Reference æ³¨å ¥åä¸ä¸ªdubboæå¡åºè¯¥æ¯å¨springä¸åªåå¨ä¸ä¸ªäºï¼ï¼äºå®ä¸çæ¯çï¼
å¤ä¸ª@Reference æ ç¾ æ³¨å ¥é 置信æ¯å®å ¨ç¸åç æå¡ ï¼æ¯ä¼ææå¡Beanç¼åçï¼ä¿è¯åªä¼æä¸ä¸ª æå¡Bean ,æºç å¦ä¸ï¼ è¿ä¸ªæ¹æ³ generateReferenceBeanCacheKey æ¯ç¼åkeyçè·åãã
private ReferenceBean<?> buildReferenceBean(Reference reference, Class<?> referenceClass) throws Exception { // è·åæå¡å¼ç¨å¯¹è±¡çç¼åkey String referenceBeanCacheKey = generateReferenceBeanCacheKey(reference, referenceClass); // ä»ç¼åmapä¸è·åæå¡å¼ç¨å¯¹è±¡ ReferenceBean<?> referenceBean = referenceBeansCache.get(referenceBeanCacheKey); if (referenceBean == null) { // å¦æå¼ç¨å¯¹è±¡ä¸ºç©ºï¼åéè¦å½åºå建ä¸ä¸ª ReferenceBeanBuilder beanBuilder = ReferenceBeanBuilder .create(reference, classLoader, applicationContext) .interfaceClass(referenceClass); referenceBean = beanBuilder.build(); //并ä¸æ¾å ¥å°ç¼åmapä¸ã referenceBeansCache.putIfAbsent(referenceBeanCacheKey, referenceBean); } return referenceBean; } private String generateReferenceBeanCacheKey(Reference reference, Class<?> beanClass) { // è·åæ¥å£å称 String interfaceName = resolveInterfaceName(reference, beanClass); // éè¿å¼ç¨çURl+æ¥å£å+æ¥å£çæ¬å·+æ¥å£åç»ï¼ç¨æ¥åç¼åkey String key = reference.url() + "/" + interfaceName + "/" + reference.version() + "/" + reference.group(); Environment environment = applicationContext.getEnvironment(); key = environment.resolvePlaceholders(key); return key; }
èªæ¤é®é¢è¯´æå®æ¯ãã
é®é¢æ´çï¼
1ï¼å¤æ³¨åä¸å¿æ¶ï¼spring èªå¨åè£ é æ¶ï¼éè¦èªå·±æå® æä¸ä¸ªæ³¨åä¸å¿ æè å°æ个注åä¸å¿ default设置为true.
2, @Resource å @Reference é½å¯ æ³¨å ¥ dubboæå¡ä½æ¯ æ¦å¿µæ¯ä¸ä¸æ ·çã
3ï¼@Reference 注解å¯ä»¥å¨å¤ä¸ªç±»ä¸æ³¨å ¥ ç¸åæå¡Bean ä¸ä¼é ææå¡Bean åå¨å¤ä¸ªãã
注ï¼æºç åè æç« /article/
Spring系列随笔1-Bean(小白入门篇)
Spring是Java开发中的重要框架,它作为Java的顶层实现,简化了软件开发工作。在实际项目中,Spring充当成熟的框架基础,提供统一的对象管理和切面编程功能,大大减少了开发量和复杂性。
Spring的核心在于它的Bean管理机制。一个对象在Spring中就等同于一个Bean,通过“反射+注入+容器”的依赖注入DI方式管理。有三种常见的配置方式:XML配置,XML核心配置加注解扫描,以及完全注解开发。Spring Boot中广泛使用完全注解的方式,比如通过@Configuration和@Bean注解来创建和注入对象。
自动注入是Bean管理的另一个重要部分,开发者可以通过类型或名称从Spring容器中获取对象,最常见的是使用@Autowired注解,它能根据类型自动绑定对象。默认情况下,Spring的Bean是单例模式,但可通过scope属性调整为多例。
Spring Bean的生命周期涉及多个步骤,虽然深入理解可能需要阅读源码,但主要可以分为创建、初始化、使用、销毁等阶段,开发者可以在这些阶段插入自定义代码来扩展Bean的行为。
jucheap 源码
中國代表呼籲盡快就恢復伊核問題全面協議的完整有效執行達成共識
测视力小程序源码怎么找_测视力小程序源码怎么找到
共享售货机 小程序 源码_共享售货机 小程序 源码是什么
openvas源码
K线形态必涨指标源码_k线必涨的20种形态图解的书