spring ---- 传智播客spring视频学习随笔上

 

在华育学习的spring根本没有深入,正好我也下载了传智spring全套视频,我这不就用心观看一遍,看视频最重要的是随手写笔记,这样当忘记时候,可以再翻出来看遍,这样理解会更深一层!! spring是黎活明老师录制的,从视频讲解的内容黎老师真的是太NB了!! 现把笔记发不出来,希望大家能指错!!Thank You!!

=======================================================================
    ======== Spring2.5.6 最新 框架 ========

一、第一课   ==》 全面阐释Spring及其各项功能
a.Spring是什么?Inversion of Control
Spring是一个开源的控制反转(IoC)和面向切面(AOP)的容器框架。主要目的简化企业开发。
b.控制反转什么?
控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器
负责。这样控制权就由应用转移到外部容器,控制权的转移就是所谓反转。
简单理解,通过构造函数,给注入进一个对象或属性set注入。
c.依赖注入(DI)是什么?
就是在运行期,由外部容器动态的将依赖对象注入到组件中。
d.为何要使用Spring?
1)降低组件之间的耦合度,实现软件各层之间的解耦。
2)可以使用容器提供的众多服务,如:事务管理服务、消息服务等等。
    当我们使用容器的事务时,开发人员就不需要手工控制服务,也不需要处理复杂的事务传播。
3)容器提供单例模式支持,开发人员就不需要自己编写实现代码。
4)容器提供了AOP技术,利用它很容易实现如权限的拦截、运行期监控等功能。
5)容器提供的众多辅助类,使用这些类能够加快应用的开发,如:Jdbc Template...
6)Spring对于主流的应用框架提供了集成支持,如:集成Hibernate、JPA...这样更便于应用的开发
e.补充说明
1)降低组件之间的耦合度,实现软件各层之间的解耦
    常用的模型Cotroller -- Service -- Dao,之间涉及到代码的使用,==耦合度
    spring实现代码的独立性,实现组件各层之间的解耦。通过接口解耦。
2)可以使用容器提供的众多服务 ==事务管理服务
    众多服务: 事务管理服务、JMS服务、Spring Core核心服务、持久化服务、其它
    事务管理服务:
    如调用Bean1Dao.update() 和 Bean2Dao.save()方法
    要同时执行,怎么保证?必须在同一连接上,事务进行处理。
    要Bean2Dao.save()一定执行,而Bean1Dao.update()根据情况而定,怎么保证?
    必须在同一连接上,Bean2Dao.save()事务与Bean1Dao.update()的事务不一样。
    了解Spring通过声明式的事务属性配置 ===>
       @Transactional(propagation=Propagation.Required/RequiresNew)
f.基本概念,轻量级和重量级。
怎么划分?主要看它使用了多少服务,使用的服务越多,容器要为普通的java对象做的工作越多,
     必然会影响到应用的发布时间或者运行的性能。
对于spring容器,它提供的很多服务,但并不是默认打开,需要则打开,
                  使用少则此时应用属于轻量级。
对于EJB容器,默认打开提供的EJB规范所有功能,所以属于重量级框架。


二、第二课   ===》 搭建与测试Spring的开发环境
a.搭建spring
前提:下载spring所需的安装包 http://www.springsource.org/download,
        根据所需使用相应的jar包。
        必须使用dist/spring.jar 和 lib/jakarta-commons/commons-logging.jar
b.spring框架既可以使用在javaSE上和J2EE上。
c.测试Spring(Java项目测试将业务bean交给spring容器管理)
第一步:导入所需jar包
第二步:配置所需的配置文件。通用放在项目的类文件中。
          配置文件格式可以从参考手册或例子。配置文件名可随便起。
第三步:实例化spring容器。(1.通过类路径实例化2.通过文件系统路径实例化)
          ApplicationContext ctx=new ClssPathXmlApplicationContext(new String[]{"**"});
          数组说明可以指定多个配置文件,也可以只传一个字符串。
          在实际企业开发中,根据不同的模块提供不同的配置文件。
第四步:创建一个单元测试,写个方法专门来实例化spring容器。
第五步:运行测试类,控制台没输出错误信息则spring环境搭建好了。
第六步:创建一个业务bean,写了一个简单方法。
          为实现软件各层之间的解耦,spring建议通过接口解耦。
          接口可以直接通过向导抽取。
第七步:将业务bean交给容器管理,则必须在配置文件里指定一些属性。
          <bean id="" name="" class=""></bean>
          <bean id="person1" class="com.itcast.Person"></bean>
          id和name区别,name可以输入一些特殊字符(/sss/fgf),
          但id本身是xml的一个属性,会被xml解析器解析进行校验,但不能输入特殊字符。
          在没有特殊字符时,应该选择id。起名spring容器建议首字母小写。
          这样bean就配置好了,此时bean就被spring容器创建及维护,我们只要从容器中获取。
第八步:怎么获取,ctx.getBean("**");获取之后通过接口引用。
          PersonService p = (PersonService)ctx.getBean("**");
          p.save();方法。
          理解PersonService p = (PersonService)ctx.getBean("**");
   PersonService是个接口,但通过ctx.getBean("**")实现类进行实例化。
          所以具有save方法。
d.单元测试,是专门用来做测试的。
e.对于配置文件里指定一些属性不出现提示内容的解决方案。
一、上网了,myeclipse有自动上网下载spring-beans-2.5.xsd文件到缓存区。
二、手动的导入,windows-preferences-myeclipse-fileandediter-xml-xmlcatalog
      点add之后指定硬盘上的路径,
      Location:dis/resource/spring-beans-2.5.xsd
      Key type:schema Location
      Key:给定的路径后加/spring-beans-2.5.xsd
      这样就ok了,就会出现提示信息。


三、第三课   ===》 编码剖析Spring管理Bean的原理
a.了解spring容器如何怎么创建管理的??
b.自己编代码实现创建。
第一步:创建一个"自学室"版的spring容器类,MyClassPathXMLApplicationContext
          构造方法接收配置文件名,并给readXML(),instanceBeans()方法
第二步:读取配置文件,读取xml文件,怎么读取请看文件。
第三步:readXML() ==>读取操作,读取是为了找到用户配置文件的id及class值
   因为读取配置文件,读取出的id值和class值存放在BeanDefinition类(id,className属性)
          读取会有多个id,class值,所以放在一个List数组里,
          List<BeanDefinition> beanDefinitions=new ArrayList<BeanDefinition>;
第四步:instanceBeans() ===>上一步只是保存了配置文件的所有id和class的值,并没有创建业务bean类实例
          怎么创建???因为是多个实例,
          所以Map<String,Object> singletons = new HashMap<String,Object>();
          for(BeanDefinition beanDefinition : beanDefinitions)
          singletons.put(beanDefinition.getId(),
   Class.forName(beanDefinition.getClassName()).newInstance());
         Class.forName("");是一个类反射技术。严格点判断实例化的类名不为null或""
第五步:前面要getBean()方法,我们在自己的spring容器提供此方法,就OK了。
          return this.sigletons.get("**");
第六步:前面实例化spring容器就需要修改成自己的容器了。
          ctx=new MyClassPathXMLApplicationContext("beans.xml");
   PersonService p = (PersonService)ctx.getBean("**");
          p.save();方法。


四、第四课   ===》 Spring的三种实例化Bean的方式
a.有三种方案创建实例
b.第一种方案,通过容器的创建实例方法,调用默认的构造函数创建实例。
第二种方案,使用静态工厂方法实例化。
              配置文件修改为
<bean id="person2" class="com.itcast.PersonFactory" factory-method="createPerson"/>
第三种方案,实例工厂方法实例化。
              先实例化工厂,再使用工厂的方法实例化
<bean id="personFactory" class="com.itcast.PersonFactory"/>
<bean id="person3" factory-bean="personFactory" factory-method="createPerson"/>
c.绝大部分都用第一方法,也根据实际情况而定。


五、第五课   ===》 配置Spring管理的bean的作用域
a.每次调用getBean()方法,从spring容器获得实例是同一个吗??
怎么验证? 判断引用是否相同,就是指针是否相同。
PersonService p1 = ****
PersonService p2 = ****
System.out.println(p1==p2);
发现默认是同一实例,因为默认是单实例。
b.要改变,涉及到bean的作用域。
singleton/prototype                   java项目
request/session/global session        Web 项目
prototype每次获得新的对象。
c.配置文件修改
<bean id="person1" class="com.itcast.Person" scope="prototype"></bean>


六、第六课   ===》 Spring管理的Bean的生命周期
a.serviceBean是在什么时候实例的???是在调用时还是spring容器加载时就创建了?
在serviceBean的构造方法里输出一句话就行了。
b.默认情况下,单实例模式下,是在容器加载时就实例化了。
而在property实例模式下,则是在调用方法时实例化。
c.当在单实例化下,设置属性lazy-init="true"时,则容器初始化不实例化。但只是针对此bean
当在beans里设置default-lazy-init="true"时则所有bean都实例化。
d.但不提倡使用,因为创建失败在运行期,我们可以在初始化看些信息。
e.在实际应用中,如打开数据库连接,关闭资源。
打开配置 init-method="init"
关闭配置 destroy-method="destroy" 但必须在容器关闭时
<bean id="person1" class="com.itcast.Person" lazy-init="false"
   init-method="init" destroy-method="destroy"/>
AbstractApplicationContext抽象类,act.close();正常关闭spring容器


七、第七课   ===》 编码剖析Spring依赖注入的原理
a.如何注入呢??如给personService注入personDao?(属性set注入,构造函数注入)
创建PersonDaoBean之后抽取接口,通过属性注入。
<bean id="personDao" class="com.itcast.PersonDaoBean">
<bean id="person1" class="com.itcast.Person">
     <property name="personDao" ref="personDao"/>
</bean>
spring根据personDao在容器找到上面定义的bean,通过反射技术得到了bean。
b.使用自学版spring容器来实现注入功能。
第一步:创建一个"自学室"版的spring容器类,MyClassPathXMLApplicationContext
          构造方法接收配置文件名,并给readXML(),instanceBeans(),injectPropertys()方法
第二步:读取配置文件,读取xml文件,怎么读取请看文件。
第三步:readXML() ==>读取操作,读取是为了找到用户配置文件的id及class值
   因为读取配置文件,读取出的id值和class值存放在BeanDefinition类(id,className属性)
          读取会有多个id,class值,所以放在一个List数组里,
          List<BeanDefinition> beanDefinitions=new ArrayList<BeanDefinition>;
第四步:instanceBeans() ===>上一步只是保存了配置文件的所有id和class的值,并没有创建业务
第五步:很复杂,只要了解了意思就可以了,看完后对如何注入还是蛮了解的。


八、第八课   ===》 编码剖析Spring装配基本属性的原理
a.属性注入两种方式,注入bean是容器开始创建的bean或在内部自己创建bean,看配置文件的设置
<bean id="person1" class="com.itcast.Person">
     <property name="personDao">
         <bean class="com.itcast.PersonDaoBean"></bean>
     </property>
</bean>
内部bean只能被当前bean使用,不能被外部bean使用。
b.对于基本属性的注入,如在personService里有个属性String name;
<bean id="person1" class="com.itcast.Person">
     <property name="personDao">
         <bean class="com.itcast.PersonDaoBean"></bean>
     </property>
     <property name="name" value="eduask"/>
</bean>
c.上面讲的注入为对象,本课讲的是注入基本元素。
d.使用中学版注入基本元素,使用了ConvertUtils.convert()类由apache提供

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值