Spring学习笔记

来源:互联网 发布:网络棋牌游戏制作 编辑:程序博客网 时间:2024/06/06 07:21

本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/blog/8/8-145.html

1、 AOP(AbstractOrientedProgramming):面向抽象编程,面向接口编程,更灵活,代码可维护性高;
2、 IoC(Inversion of Control):控制反转,把原来需要自己new来提供的对象改成容器来提供,通过配置文件配置,自动依赖注入,增强了程序的灵活性和可维护性,灵活装配;
  特点:在容器创建对象的时候也把对象中的属性根据配置文件注入了,并且可以根据配置文件直接配置对象中属性的具体哪个实现,从而形成AOP的目的;
3、 IoC容器配置:
  <!-- 定义Dao -->
  <bean id="ud" class="com.silence.spring.dao.impl.UserDaoImpl"></bean>
  <!-- 定义UserService,自动注入userDao属性 -->
  <bean id="userService"
     class="com.silence.spring.service.UserService">
     <property name="userDao" ref="ud"></property>
  </bean>
  注:ref属性表示参考前面定义的bean拿来用,如果改成<bean/>标签表示当前new一个对象用来注入。
      Id和name属性用处完全一样,只是name能放特殊字符(无用);
      <property/>的value属性用来给bean的简单属性赋值;
4、 IoC容器中对象获取:
  //获取配置文件对象
  ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  //根据id值获取容器中相应的对象
  UserService service = (UserService) context.getBean("userService");
5、 Spring注入方式:
  A. setter注入(重要);
  B. 构造方法注入(不重要),<constructor-arg>进行装配,可设置索引和类型进行多参数定位;
  C. 接口注入(不用);
6、 bean的生存范围:
  <bean/>的scope属性:常用singleton(单例)和prototype(原型)两种设计属性。
7、 集合装配:
  <property/>可以有<list/><set/><map/><props/>等子标签,用来实现集合装配。
8、 自动装配:
  <bean/>的autowire属性:一般设置byName或byType,实现不用装配<property/>就自动装配,用的不多,特定场合使用。
9、 惰性加载:(调试程序加快启动使用)
  <bean/>的lazy-init设置;
  <beans/>的default-lazy-init设置默认所有bean的延迟加载方案。
10、 bean的生命周期:
  <bean/>的init-method属性和destroy-method属性执行该bean在初始化和销毁的时候需要执行的方法名,如果scope是prototype的话,destroy-method不会执行。
11、 注解:
  开启spring注解支持<context:annotation-config/>
  A.@Autowired:set方法上,默认byType查找;
  B.@Qualifier:在参数上,指定查找容器中对象的name或id,定向查找,相当于<qualifier/>标签;
  C.@Required:set方法上,初始化必须装配,否则报错;

以下的是JPA标准的,需要j2ee包支持:
  D.@Resource:JPA标准,set方法上,先找name再找type,value属性设置name,和Qualifier类似,代替@Autowired;
  E.@Component:标记一个组件,代替在xml文件中的<bean/>标签声明,配合@Resource,value属性指定组件key,xml文件中要写:
   //设定要扫描@Component的包
   <context:component-scan base-package="com.silence.spring.dao.impl"/>
  F.@Repository,@Service,@Controller目前和@Component一样;
  G.@Scope:指定bean的生存周期;
  H.@PostConstruct:指定bean初始化的方法,相当于init-method属性;
  I.@PreDestroy:指定bean销毁要调用的方法,相当于destroy-method属性;
12、 AOP(Aspect-Oriented-Programming):面向切面编程
原来是程序流程一条线执行下去,现在在这条线上横切一个切面,在该切面上的执行语句,可以为它执行前和执行后添加其他逻辑代码,实现对原来业务逻辑的功能拓展,比如权限拦截,日志输出等,好处是可以很方便的控制这些额外代码是否执行,避免了增删这些逻辑产生的庞大的工作量。
注:Servlet的Filter和Struts2的拦截器都是AOP编程的例子。
(1)注解实现:
   A.//设置动态代理类库支持,注解
    <aop:aspectj-autoproxy />
   B.编写织入切面类:例:LogInterceptor日志拦截
   C.标注组件:@Component
   D.标注切面:@Aspect
   E.标注织入建议@Before,例如:
     "execution(public void com.UserDaoImpl.addUser(com.User))"
    表示在addUser方法执行前执行该织入方法(此注解标记的方法)
    类似还有After(finally),AfterReturning,AfterThrowing,Around
    标记字符串写法参考spring文档
    样例:同一个方法注解全部使用的执行结果:
     
   好处:对一个业务逻辑划分切面织入其他业务逻辑时,完全不需要修改任何原逻辑代码,只需要在需要切入的方法处标记相应的注解即可。
 (2)XML实现:
   <!-- xml配置aop切面织入 -->
   <!-- 配置一个切面处理类bean -->
   <bean id="loginterceptor2" class="com.silence.spring.aop.LogInterceptor2"></bean>
   <!-- 配置切面织入代理 -->
   <aop:config>
       <!-- 配置一个全局的切面,指定好该切面的匹配条件 -->
      <aop:pointcut id="mypointcut" expression="execution(public void          com.silence.spring.dao.impl.UserDaoImpl.addUser(com.silence.spring.domain.User))"/>
      <!-- 配置切面执行策略,引用切面处理类bean -->
      <aop:aspect id="myaspect" ref="loginterceptor2">
         <!-- 引用切面,在该切面执行loginterceptor2的before方法,策略为 aop:before-->
         <aop:before method="before" pointcut-ref="mypointcut"/>
      </aop:aspect>
    </aop:config>
 注:其他注意事项和注解一致。
13、配置properties文件
 <!-- 配置property文件支持,占位符提取 -->
 <bean
 class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="locations">
   <value>classpath:jdbc.properties</value>
  </property>
 </bean>
配置完:可以引用配置文件中的属性
 value="$ {jdbc.driverClassName}"
14、 动态代理实现:
被代理类有实现接口:JDK自带Proxy;
被代理类没实现接口:CDLIB通过修改二进制码实现动态代理;
15、 Spring配置方式选择:
 IoC容器中bean配置:注解适用;
 AOP面向切面设计:Xml配置适用。
16、Spring常用应用:
 (1)IoC容器配置DataSource数据库连接池,再通过在Dao处自动注入dataSource,达成配置;
 (2)
17、集成Hibernate:
 (1)初步集成:
    A.加入Hibernate的jar包和相关的支持jar
    B.Spring配置sessionFactory的bean放入IoC容器,再在需要的位置拿出使用:
  主要配置Hibernate的主配置文件信息和对象映射文件的位置(或者加了注解的实体类全名),然后生成的sessionFactory交给IoC容器管理,自动注入Dao的Bean中。
 <!-- 集成Hibernate -->
 <bean id="sessionFactory"
  class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
  <!-- 配置连接池 -->
  <property name="dataSource" ref="dataSource" />
  <!-- 配置注解组件类 -->
  <property name="annotatedClasses">
   <list>
    <value>com.silence.spring.domain.User</value>
   </list>
  </property>
  <!-- Hibernate主配置文件内容 -->
  <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
    <prop key="hibernate.show_sql">true</prop>
   </props>
  </property>
 </bean>
 (2)Spring事务管理:
  A.定义Hibernate事务管理器,切面类:
 <!-- Hibernate事务管理器 -->
 <bean id="txManager"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory" />
 </bean>
  B.使用事务管理器:
 <!-- 使用事务管理器 -->
 <tx:annotation-driven transaction-manager="txManager"/>
  C.在需要事务管理的业务处理方法上注解@Transactional
 注:
  A. 业务处理方法用getCurrentSession(),不需要close,不需要处理事务,抓到RunTimeException会自动回滚;
  B. @Transactional意味着注解的方法在前后调用事务管理器切面类,在方法调用前后自动维护好事务操作。
  C. 事务管理多使用xml配置,注解需要为每个方法注解。

18、 @Transactional 的属性
 (1)propagation:事务传播机制设置
事务传播行为类型 说明
PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是 最常见的选择。
PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与 PROPAGATION_REQUIRED 类似的操作。

 (2)isolation:事务隔离级别;
 (3)readOnly:只读,进行优化,提高性能;
 (4)rollbackFor:回滚条件,默认运行时异常
19、HibernateDaoSupport:
 功能:封装了HibernateTemplate和sessionFactory;
 继承这个类去写Dao方便,但是每个Dao都要xml配置bean-
 或者继承HibernateDaoSupport写一个BaseDao,并写一个设置hibernateTemplate的方法,在里面调用super.setHibernateTemplate()方法,再在上面用注解注入hibernateTemplate实例,就会把配置好的hibernateTemplate注入到此Dao中。
注:自己用包装设计模式写一个BaseDao,自行维护hibernateTemplate和sessionFactory对象并进行对象注入,再去继承这个Dao写具体的其他实现的Dao即可实现其子类的Dao的自动注入。
20、Hibernate的Session关闭后查询的解决方式之一:
在web.xml设置过滤器org.springframework.orm.hibernate3.support.OpenSessionInViewFilter,对所有路径进行过滤,可以控制Session在请求前打开,页面请求结束后才关闭,避免了Session延迟操作的关闭后查询问题。
注:该过滤器要在struts2的过滤器之前设置,设置时过滤器的顺序问题可能引发异常。
21、整合Struts:(Spring作为Struts的插件整合到Struts,Struts自己维护Action容器)
目的:配置好让Struts向Spring容器请求业务处理类对象,并自动注入到Struts中。
(1) 设置服务器启动自动装载Spring容器并实例化对象:(web.xml)
   <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    <!-- 默认是去找WEB-INF下的applicationContext.xml配置文件 -->
   </listener>
(2) 设置要装载的Spring配置文件路径:
  <!-- 这里设置加载的applicationContext.xml路径 -->
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:applicationContext.xml</param-value>
  <!-- <param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml</param-value> -->
 </context-param>
(3) 加入struts2-spring-plugin.jar包,此时Struts的Action的产生会放入专有的Action容器并把Action中的属性从Spring中找到相应的对象注入;
整合运行流程:
在struts-config.xml的配置文件中,配置了Struts的Action,指明了Action的name属性,Struts配置的所有Action会由struts2-spring-plugin维护在一个专有的Action的容器中,以name属性作为检索条件,prototype方式产生给用户的Action副本,用户界面也是通过Action的name找到该Action的。因此Action中不需要配置任何注解即可正常运行。
Struts的Action在产生时,Action中的属性的set方法会自动按照名称name从Spring容器中注入相同name的对象,没有配置xml或者注解也会自动注入,此处若在设计时使用了重名name的bean和Action属性有时候会出现注入错误的情况发生。
总结:Struts-Spring整合后会有两个容器,Action容器和Spring的IoC容器,Action容器负责维护Action,IoC负责维护业务处理层以上的所有bean对象,当用户发送一个请求时,通过Action的name找到一个Action,并自动从Spring容器中找到Action对象中的相应属性名称的对象,注入到Action的属性上(该属性对象必须要有set方法),完成完整的Action的初始化,使Action中有了业务处理对象,可以执行相应的业务处理。即Action中的代码相对于整合Spring前不需要改变。
Action中的属性对象的注入是按照name,type,constructor顺序进行检索的,在设置对象的name属性时一定注意属性间重名可能导致的冲突问题。
Action中的属性对象若需要人工自定义注入,在属性的上面@Resource即可指定。
22、整合Struts:(Spring作为Struts的插件整合到Struts,Spring容器维护Action)
(1) 设置服务器启动自动装载Spring容器并实例化对象:(web.xml)
   <listener>
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
     <!-- 默认是去找WEB-INF下的applicationContext.xml配置文件 -->
   </listener>
(2) 设置要装载的Spring配置文件路径:
  <!-- 这里设置加载的applicationContext.xml路径 -->
  <context-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>classpath:applicationContext.xml</param-value>
  <!-- <param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml</param-value> -->
  </context-param>
(3) 加入struts2-spring-plugin.jar包;
(4) struts-config.xml文件中的<action>标签的class属性用spring中的name填写,这样就不会有Action容器,把Action也交给Spring容器管理;
(5) Action中要用@Component指定Action的名称,@Scope指定prototype类型,需要注入的属性用@Resource指定注入,这样该Action就和普通的Spring容器中对象一样。
执行过程:
用户请求通过struts-config.xml找到对应的action的名称(@Component标明),根据名称从Spring取出,并根据注解注入action需要的业务处理对象处理请求。
23、DTO(Data Transfer Object)或VO(Value Object):比如formbean的不是和数据库对应的实体的JavaBean,只是用来存储暂时数据值的对象实体。
24、中文乱码:
org.springframework.web.filter.CharacterEncodingFilter过滤器配置到web.xml并设置初始化参数encoding指定编码集即可解决表示层的乱码问题。
25、Spring单元测试支持:
测试原则:不破坏数据库现场。
AbstractTtransactionalJunit4SpringContextTests
26、OpenSessionInViewInterceptor、AbstractTtransactionalJunit4SpringContextTests

本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/blog/8/8-145.html

0 0