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)实例工厂:
没有静态方法,因此配置时,先实例化工厂,在实例化需要的elper源码分析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定义创建的实例,将不会看到这些特定于某个请求的状态变化。
当处理请求结束,php全返源码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装载配置文件后,python非源码发布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初始化。bcb 看函数源码
加载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的行为。