黑马程序员spring知识总结技术帖.docx
- 文档编号:29577050
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:67
- 大小:156KB
黑马程序员spring知识总结技术帖.docx
《黑马程序员spring知识总结技术帖.docx》由会员分享,可在线阅读,更多相关《黑马程序员spring知识总结技术帖.docx(67页珍藏版)》请在冰豆网上搜索。
黑马程序员spring知识总结技术帖
Spring框架
一、技术说明(技术介绍,技术优势以及发展史等)
1.1、什么是spring
●Spring是分层的JavaSE/EEfull-stack轻量级开源框架
分层:
三层体系结构,为每一个层都提供解决方案
web层:
struts2、spring-mvc
service层:
spring
dao层:
hibernate、mybatis、jdbcTemplate(spring)
轻量级:
使用时占用资源少,依赖程序少。
比较:
EJB
1.2、spring由来
ExpertOne-to-OneJ2EEDesignandDevelopment,介绍EJB,使用,特点
ExpertOne-to-OneJ2EEDevelopmentwithoutEJB,不使用EJB,spring思想
1.3、spring核心
●以IoC(InverseofControl反转控制)和AOP(AspectOrientedProgramming面向切面编程为内核)
1.4、spring优点
●方便解耦,简化开发(易扩展,易维护)
•Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理
●AOP编程的支持
•Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
●声明式事务的支持
•只需要通过配置就可以完成对事务的管理,而无需手动编程
●方便程序的测试
•Spring对Junit4支持,可以通过注解方便的测试Spring程序
●方便集成各种优秀框架
•Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:
Struts、Hibernate、MyBatis、Quartz等)的直接支持
●降低JavaEEAPI的使用难度
•Spring对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低
1.5、spring体系结构
●spring核心功能:
beans、core、context、expression
二、环境搭建(技术开发环境)
2.1、获取Springframeworkjar包
1、spring官网下载
下载完成后会发现三个目录,命名很明确。
Docs目录相关文档。
包括一份API和一份各种spring的使用说明(reference),reference提供了HTML.PDF版本,非常详细。
2.spring包的核心包
搭建第一个用到spring依赖注册的程序
直接用eclipse建立一个JAVA项目
然后添加spring的jar包引入
注:
和hibernate一起用时这个JAR会冲突,解决方法删掉它就是了
Causedby:
除此之外,还有需要一个Apachecommon的JAR包
3.配置XML
Spring的最大的作用就是提供bean的管理功能,在spring中bean的管理是通过XML实现的,要用此功能,需要把bean配置到spring的xml
1.新建立一个xml.名字任意,如applicationContext.xml,或者text.xml都可以
2.添加xml头定义
①
②③
">
②schemaLoacation.用于绑定命名空间的schema文件,通常是用URL值对,中间用空格隔开,前面URL是命名空间,后面URL为schema的文件地址
③xsd的存放地址,如果没有声明,eclipse会去网上下载.
在创建xml时,在eclipse编辑xml配置没有提示。
可以对eclipse中进行schema文件的添加
具体是
WindowsPreferences,搜索XMLcatalog,添加schema文件。
然后添加,编写spring配置文件就能有提示了
4.依赖注入
4.1、spring注入的简单案例(入门级)
新建一个class用于注入,
packageorg.beans;
publicclassTest{publicvoidsay(){
把类通过xml配置注入
测试:
packageorg.beans;
publicclasstestBeans{
publicstaticvoidmain(String[]args){
ApplicationContextctx=newClassPathXmlApplicationContext("test.xml");
Testtest=(Test)ctx.getBean("test");
test.say();}
}
4.2、spring框架为我们提供了三种注入方式,分别是set注入,构造方法注入,接口注入。
接口注入不作要求,下面介绍前两种方式。
1、set注入
采用属性的set方法进行初始化,就成为set注入。
1)给普通字符类型赋值。
[java]viewplaincopy
1.publicclassUser{
2.privateStringusername;
3.publicStringgetUsername(){
4.returnusername;
5.}
6.publicvoidsetUsername(Stringusername){
7.this.username=username;
8.}
9.}
我们只需要提供属性的set方法,然后去属性文件中去配置好让框架能够找到applicationContext.xml文件的beans标签。
标签beans中添加bean标签,指定id,class值,id值不做要求,class值为对象所在的完整路径。
bean标签再添加property标签,要求,name值与User类中对应的属性名称一致。
value值就是我们要给User类中的username属性赋的值。
1.
2. pre"> 3. 2)给对象赋值 同样提供对象的set方法 1.publicclassUser{ 2.privateUserServiceuserservice; 3.publicUserServicegetUserservice(){ 4.returnuser; 5.} 6.publicvoidsetUserservice(UserServiceuserservice){ 7.this.userservice=userservice; 8.} 9.} 配置文件中要增加UserService的bean标签声明及User对象对UserService引用。 1. --对象的声明--> 2. 3. 4. 5. 这样配置,框架就会将UserService对象注入到User类中。 3)给list集合赋值 同样提供set方法 1.publicclassUser{ 2.privateList 3.publicList 4.returnusername; 5.} 6.publicvoidsetUsername(List 7.this.username=username; 8.} 9.} 1. 2. 3. 4. 5. 6. 7. 8. 9. 4)给属性文件中的字段赋值 1.publicclassUser{ 2.privatePropertiesprops; 3.publicPropertiesgetProps(){ 4.returnprops; 5.} 6.publicvoidsetProps(Propertiesprops){ 7.this.props=props; 8.} 9.} 1. 2. 3. 4. oracle: thin: @localhost: orl 5. 6. 7. 8. 9. 10. 注意: 无论给什么赋值,配置文件中 2、构造方法注入 1)构造方法一个参数 1.publicclassUser{ 2.privateStringusercode; 3.publicUser(Stringusercode){ 4.this.usercode=usercode; 5.} 6.} 1. 2. 3. 2)构造函数有两个参数时 当参数为非字符串类型时,在配置文件中需要制定类型,如果不指定类型一律按照字符串类型赋值。 当参数类型不一致时,框架是按照字符串的类型进行查找的,因此需要在配置文件中制定是参数的位置 1. 2. 这样制定,就是构造函数中,第一个参数为string类型,第二个参数为int类型 5、Spring的junit单元测试 单元测试以set注入的第一个实例为测试对象。 进行单元测试。 1,拷贝jar包 2,写业务类 1.publicclassUser{ 2.privateStringusername; 3.publicStringgetUsername(){ 4.returnusername; 5.} 6.publicvoidsetUsername(Stringusername){ 7.this.username=username; 8.} 9.//添加方法 10.publicStringlogin()throwsException{ 11.if("admin".equals(username){ 12.return"success"; 13.}else{ 14.return"error"; 15.} 16.} 17.} 3,定义测试类 4,增加测试方法 测试方法必须是public,不应该有返回值,方法名必须以test开头,无参数 测试方法是有执行先后顺序,按照方法的定义先后顺序 多个测试方法对同一个业务方法进行测试,一般每个逻辑分支结构都有测试到。 1.publicclassTestUserextendsTestCase{ 2.publicvoidtestUser_Success()throwsException{ 3.//准备数据 4.Useraction=newUser(); 5.action.setUsername("admin"); 6.//调用被测试方法 7.Stringresult=action.login(); 8.//判断测试是否通过 9.assertEquals("success",result); 10.} 11.} 运行程序,如果测试成功会出现如下图所示的结果 如果运行失败,有方法没有通过测试,那么就会显示出在哪个方法出错了。 上图中绿色的条会变成红色的。 5,测试类的生命周期方法 1.//用来进行初始化操作 2.@Override 3.protectedvoidsetUp()throwsException{ 4."setUp..."); 5.} 6.//用来做销毁操作 7.@Override 8.protectedvoidtearDown()throwsException{ 9."tearDown..."); 10.} setUp方法会在每一个测试方法前执行一次。 tearDown方法会在每一个测试方法后执行一次 6、Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义 1、Spring IoC容器对于类级别的注解和类内部的注解分以下两种处理策略: (1).类级别的注解: 如@Component、@Repository、@Controller、@Service以及JavaEE6的@ManagedBean和@Named注解,都是添加在类上面的类级别注解,Spring容器根据注解的过滤规则扫描读取注解Bean定义类,并将其注册到SpringIoC容器中。 (2).类内部的注解: 如@Autowire、@Value、@Resource以及EJB和WebService相关的注解等,都是添加在类内部的字段或者方法上的类内部注解,SpringIoC容器通过Bean后置注解处理器解析Bean内部的注解。 下面将根据这两种处理策略,分别分析Spring处理注解相关的源码。 2.AnnotationConfigApplicationContext对注解Bean初始化: Spring中,管理注解Bean定义的容器有两个: AnnotationConfigApplicationContext和AnnotationConfigWebApplicationContex。 这两个类是专门处理Spring注解方式配置的容器,直接依赖于注解作为容器配置信息来源的IoC容器。 AnnotationConfigWebApplicationContext是AnnotationConfigApplicationContext的web版本,两者的用法以及对注解的处理方式几乎没有什么差别,因此本文将以AnnotationConfigApplicationContext为例进行讲解。 AnnotationConfigApplicationContext的源码如下: 1.publicclassAnnotationConfigApplicationContextextendsGenericApplicationContext{ 2.//创建一个读取注解的Bean定义读取器,并将其设置到容器中 3.privatefinalAnnotatedBeanDefinitionReaderreader=newAnnotatedBeanDefinitionReader(this); 4.//创建一个扫描指定类路径中注解Bean定义的扫描器,并将其设置到容器中 5.privatefinalClassPathBeanDefinitionScannerscanner=newClassPathBeanDefinitionScanner(this); 6.//默认构造函数,初始化一个空容器,容器不包含任何Bean信息,需要在稍后通过调用其register()//方法注册配置类,并调用refresh()方法刷新容器,触发容器对注解Bean的载入、解析和注册过程 7.publicAnnotationConfigApplicationContext(){ 8.} 9.//最常用的构造函数,通过将涉及到的配置类传递给该构造函数,以实现将相应配置类中的Bean 10.//自动注册到容器中 11.publicAnnotationConfigApplicationContext(Class<>...annotatedClasses){ 12.register(annotatedClasses); 13.refresh(); 14.} 15.//该构造函数会自动扫描以给定的包及其子包下的所有类,并自动识别所有的SpringBean,将其 16.//注册到容器中 17.publicAnnotationConfigApplicationContext(String...basePackages){ 18.scan(basePackages); 19.refresh(); 20.} 21.//为容器的注解Bean读取器和注解Bean扫描器设置Bean名称产生器 22.publicvoidsetBeanNameGenerator(BeanNameGeneratorbeanNameGenerator){ 23.this.reader.setBeanNameGenerator(beanNameGenerator); 24.this.scanner.setBeanNameGenerator(beanNameGenerator); 25.} 26.//为容器的注解Bean读取器和注解Bean扫描器设置作用范围元信息解析器 27.publicvoidsetScopeMetadataResolver(ScopeMetadataResolverscopeMetadataResolver){ 28.this.reader.setScopeMetadataResolver(scopeMetadataResolver); 29.this.scanner.setScopeMetadataResolver(scopeMetadataResolver); 30.} 31.//为容器注册一个要被处理的注解Bean,新注册的Bean,必须手动调用容器的 32.//refresh()方法刷新容器,触发容器对新注册的Bean的处理 33.publicvoidregister(Class<>...annotatedClasses){ 34.this.reader.register(annotatedClasses); 35.} 36.//扫描指定包路径及其子包下的注解类,为了使新添加的类被处理,必须手动调用 37.//refresh()方法刷新容器 38.publicvoidscan(String...basePackages){ 39.this.scanner.scan(basePackages); 40.} 41.} 通过对AnnotationConfigApplicationContext的源码分析,我们了解到Spring对注解的处理分为两种方式: (1).直接将注解Bean注册到容器中: 可以在初始化容器时注册;也可以在容器创建之后手动调用注册方法向容器注册,然后通过手动刷新容器,使得容器对注册的注解Bean进行处理。 (2).通过扫描指定的包及其子包下的所有类: 在初始化注解容器时指定要自动扫描的路径,如果容器创建以后向给定路径动态添加了注解Bean,则需要手动调用容器扫描的方法,然后手动刷新容器,使得容器对所注册的Bean进行处理。 接下来,将会对两种处理方式详细分析其实现过程。 3.AnnotationConfigApplicationContext注册注解Bean: 当创建注解处理容器时,如果传入的初始参数是具体的注解Bean定义类时,注解容器读取并注册。 (1).AnnotationConfigApplicationContext通过调用注解Bean定义读取器AnnotatedBeanDefinitionReader的register方法向容器注册指定的注解Bean 注解Bean定义读取器向容器注册注解Bean的源码如下: 1.//注册多个注解Bean定义类 2.publicvoidregister(Class<>...annotatedClasses){ 3.for(Class<>annotatedClass: annotatedClasses){ 4.registerBean(annotatedClass); 5.} 6.} 7.//注册一个注解Bean定义类 8.publicvoidregisterBean(Class<>annotatedClass){ 9.registerBean(annotatedClass,null,(Class 10.} 11.//Bean定义读取器注册注解Bean定义的入口方法 12.publicvoidregisterBean(Class<>annotatedClass,Class 13.registerBean(annotatedClass,null,qualifiers); 14.} 15.//Bean定义读取器向容器注册注解Bean定义类 16.publicvoidregisterBean(Class<>annotatedClass,Stringname,Class 17.//根据指定的注解Bean定义类,创建Spring容器中对注解Bean的封装的数据结构 18.AnnotatedGenericBeanDefinitionabd=newAnnotatedGenericBeanDefinition(annotatedClass); 19.//解析注解Bean定义的作用域,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 黑马 程序员 spring 知识 总结 技术