Spring 技术总结

本文详细介绍了Spring框架的核心组件,包括Spring Core、Context、AOP和IOC等,阐述了使用Spring的步骤,如添加jar包、配置bean等。同时,讲解了Spring涉及的工厂和单态设计模式,BeanFactory的功能及ApplicationContext的使用。文章还涵盖了Bean的管理,如初始化、作用域、依赖注入等。此外,还讨论了Spring的事务管理,包括编程式和声明式事务,并提到了计划任务的实现方式。
摘要由CSDN通过智能技术生成

一、spring体系结构

1、Spring Core                Spring的核心,管理bean,提供依赖注入
2、Spring Context             Spring的上下文,BeanFactory的一个子接口
3、Spring AOP                 Spring的面向方面编程
4、Spring DAO                 Spring对JDBC的封装
5、Spring ORM                 Spring对ORM框架的支持(hibernate ...)
6、Spring Web                 Spring对Web MVC框架的支持(struts ...)
7、Spring Web MVC             Spring自身的MVC框架


二、使用Spring的实现步骤

1、创建项目并添加Spring所需jar包。(spring.jar,log4j的日志jar包,还有jakarta-commons的相关jar包)
2、创建log4j.properties文件,用来控制日志输出。
3、新建一个javaBean 。其中的属性需要定义set和get方法 。
4、创建applicationContext.xml文件,这是Spring的配置文件,可以定义上述bean以及它的属性。
5、新建一个java类,通过ApplicationContext接口的一个实现类ClassPathXmlApplicationContext读取pplicationContext.xml文件:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
然后就可以使用context的getBean(String id)方法获得指定类的实例:
HelloSping hellospring = (HelloSping)context.getBean("helloSpring");
其中helloSpring就是配置文件中bean的id 。
<bean id="helloSpring" class="com.pb.HelloSping">
接下来就可以调用获得类的方法,通过配置文件注入所需要的类,从而实现松耦合。


三、Spring框架涉及到的两种主要的设计模式

1、工厂模式  创建bean的功能由Spring工厂完成,不需要调用者创建。根据要求返回适合的类实例,工厂内的类实例其实是实现相同接口或父类的实例。
2、单态模式  对于相同id的bean的请求都返回同一个bean实例,减少系统对创建和销毁bean的开销 。
(1)把类实例设置为静态属性
(2)所有构造方法设置成私有的
(3)提供一个静态的方法获取实例属性


四、BeanFactory介绍

1、BeanFactory的作用
配置、创建以及管理bean对象(但是bean是存在于spring容器中,BeanFactory是spring容器中的一个工具)
维持Bean对象之间的依赖关系
负责Bean对象的生命周期
2、BeanFactory通常有如下方法
(1)containsBean(String beanname) //判断spring配置文件中是否有id为beanname的bean
(2)Object getBean(String beanname) //获得Bean实例
3、BeanFactory常用实现类
(1)XmlBeanFactory
(2)ApplicationContext(是BeanFactory的子接口,实现了BeanFactory的全部功能,j2ee项目推荐使用,其常用的实现类是FileSystemXmlApplicationContext和ClassPathXmlApplicationContext)
(2.1)该接口还实现了国际化的支持
(2.2)通过getResource(String resourcename)可以轻松获得Resource对象
(2.3)事件传播(自行查阅资料)
(2.4)多配置文件的加载(三种方式)
(2.4.1).第一种,使用数组参数
  ApplicationContext contex=new ClassPathXmlApplicationContext(new String["a1.xml","a2.xml"]);
(2.4.2).第二种,只用通配符
  ApplicationContext contex=new ClassPathXmlApplicationContext("a*.xml");
  但此种方法只对文件系统中的xml文件有效,针对jar包中的无效
(2.4.3).第三种,引入
  ApplicationContext contex=new ClassXmlApplicationContext("a1.xml");
  在a1.xml中
     <import resource="a2.xml"/>  执行resource路径为相对a1.xml的路径


五、ApplicationContext.xml结构分析

1、根节点<beans></beans>
2、根节点中可以包含多个<bean></bean>节点。
3、<bean>节点中有两个重要属性id(name)和class,示例如下:
<bean id="helloSpring" class="com.pb.HelloSping">
  <property name="str">
   <value>军人</value>
  </property>
  <property name="man">
   <value>林冲</value>
  </property>
</bean>
4、Bean在spring容器中有两种行为
(1)singleton  返回唯一实例
(2)non-singleton  每次请求创建新的实例
5、使用getBean(String beanid)获取bean的实例时,如果查找不到id为beanid的bean时,就会查找name为beanid的bean,如果还是查找不到就会抛出异常。但是当配置文件中的bean既没有id属性,也没有name属性,只有class属性,这时我们可以通过类的全限定名获得bean,示例如下:
<bean class="com.pb.HelloSping">
</bean>
HelloSpring hello = Context.getBean("com.pb.HelloSping");
6、指定bean的别名
<alias name="fromname" alias="toname" />
fromname指代的是bean的id或者name,toname指代的是为该bean指定的代号。该代号也可以用于getBean方法获得bean。

六、Bean的管理

1、对于基本数据类型和String类型的属性可以使用以下语句进行配置
<property name="name">
 <value>小明</value>
</property>
<property name="age">
 <value>13</value>
</property>
针对以上类型的属性,都是以String的方法注入,然后由Spring自行转换为对应的类型。
2、对于属性为对象类型的,例如Beans中其它bean类型的属性,需要使用以下配置
<property name="man">
 <ref bean="man" />
</property>
其中ref中的bean属性填入引用的bean的name或者id,除了使用bean属性之外还可以使用local属性,它们之间的区别是,bean属性可以引用不在同一个配置文件中的bean对象

3、对于集合元素类型属性的配置方法如下
(1)List   list中可以注入普通类型的值,也可以注入对象类型的值,也可以引用其它bean
   <property name="lists">
 <list>
    <value><value>
    <bean class="com.pb.SpringMan">
  ....
     </bean>
  .....
    <ref bean="" />
        </list>
   </property>
(2)Map
   <property name="maps">
 <map>
    <entry key="key1">
               <value>value1</value>
    </entry>
    <entry key="key2">
               <value>value2</value>
    </entry>
    <entry key="key3">
               <value>value3</value>
    </entry>
        </map>
   </property>
(3)Props
   <property name="props">
 <props>
    <prop key="key1">value1</prop>
    <prop key="key2">value2</prop>
    <prop key="key3">value3</prop>
        </props>
   </property>
(4)Set   set中可以注入普通类型的值,也可以注入对象类型的值,也可以引用其它bean
   <property name="sets">
 <set>
    <value><value>
    <bean class="com.pb.SpringMan">
  ....
     </bean>
  .....
    <ref bean="" />
        </set>
   </property>

4、bean的autowire属性有以下三个值
(1)、no(默认)  不使用自动绑定,bean 通过ref进行绑定
(2)、byName    根据属性的名称进行自动绑定
(3)、byType    根据属性的类型进行自动绑定
假如有一个类A,它包含一个属性b,该属性是对象类型的(类B),那么在配置文件中定义bean的时候就是如下这样:
<bean id="b" class="B"></bean>
<bean id="a" class="A" >
    <property name="b">
 <ref bean="b" />
    </property>
</bean>
这就是默认情况下的配置,即autowire="no" ,如果设置autowire="byName ",则不需要使用<property>来指定,Spring会通过属性名来寻找匹配的id的bean注入到属性中,通过设置autowire="byType "  则会通过属性的类型来寻找匹配的bean,如果找到多个匹配类型的bean则会抛出异常。

5、bean的作用域(设置bean的Scope属性)
(1)singletion 默认的,每个IOC容器只创建一个Bean实例

(2)prototype每次请求创建一个Bean实例

(3)request每次http请求创建一个实例

(4)session每次会话创建一个实例

(5)globalsession每个全局Http请求创建一个实例

6、Bean注入依赖关系后和销毁前的管理
(1)Bean注入依赖关系后
(1.1)通过指定init-method属性可以在注入依赖关系后执行一些操作,例如在Bean类中定义了一个init()方法,然后可以在配置文件对应的bean元素中添加init-method="init" 。
(1.2)通过创建类实现InitializingBean接口,然后实现里面的afterPropertiesSet()方法也可以实现上述的效果,使用该方法需要在配置文件中添加该类相应的bean,但是不推荐使用该方法,因为会造成与spring接口耦合。
(2)Bean销毁前
(2.1)通过指定destroy-method属性可以在销毁bean前执行一些操作
(2.2)通过创建类实现DisposeableBean接口,然后实现里面的destroy()方法也可以实现上述的效果

7、Bean配置的parent属性
(1)使用parent属性可以继承其它Bean的配置,可以把某些Bean的相同配置独立出来做成一个Bean,然后其它Bean继承该Bean,可以减少工作量,提高开发效率。
<bean id="women" class="com.pb.SpringWomen" parent="man1">

8、Bean注入方式
(1)属性注入  使用property
(2)构造方法注入  使用带参的构造方法,首先需要在类中定义相应的构造方法,然后需要在配置文件中指定构造方法参数的值如下:
<bean id="women1" class="com.pb.SpringWomen">
    <constructor-arg index="0">
 <value>朴信惠</value>
    </constructor-arg>
    <constructor-arg index="1">
 <value>27</value>
    </constructor-arg>
</bean>

9、针对Bean类的相关Aware接口
(1)BeanNameAware  实现该接口的Bean类可以通过实现该接口的一个方法:void setBeanName(String BeanId) 获得配置文件中对应Bean的Id或者name 。
(2)BeanFactoryAware  实现该接口的Bean可以通过对应的setBeanFactory方法(与上类似)获得BeanFactory实例
(3)ApplicationContextAware    实现该接口的Bean可以通过对应的setApplicationContext方法(与上类似)获得ApplicationContext实例

10、Bean的高级管理
(1)实现BeanPostProcessor(Bean后处理器)接口的Bean可以在Spring创建Bean实例之前和创建之后执行一些操作,需要实现该接口的两个方法:Object postProcessAfterInitialization(Object Bean,String BeanName) 和 Object postProcessBeforeInitialization (Object Bean,String BeanName) ,这两个方法有两个参数Bean为容器创建的Bean实例,BeanName是Bean配置中的id或者name,实现后一个方法的之后需要返回Bean,否则会出现空指针异常 。
(2)BeanFactoryPostProcessor(容器后处理器)可以在BeanFactory读取配置文件后,实例化Bean之前执行一些操作,需要实现以下方法
void postProcessBeanFactory(ConfigurableListableBeanFactory Congifg)  。
针对以上接口,如果是通过ApplicationContext建立的容器,只需要在配置文件中添加实现该接口的相应的Bean,容器就会自动识别并执行,而如果是通过BeanFactory建立的容器,则需要手动注册
(3)PropertyPlaceholderConfigurer 属性占位符配置器 是BeanFactoryPostProcessor的实现类,该类有如下作用:
(3.1)读取properties配置文件
(3.2)不需要打开Spring配置文件的情况下,也可以把properties配置文件中的某些值引入到Spring配置文件中
(3.3)可以配置多个配置文件信息
直接在Spring配置文件中添加相应的Bean配置即可使用
<bean id="propertypConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
 <property name="locations">
  <list>
   <value>xxxx.properties</value>
   <value>xxxx.properties</value>
   .......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值