spring介绍

15 篇文章 0 订阅
13 篇文章 0 订阅


1.DI 依赖注入

  在Spring框架中,两个组件对象之间具有依赖关系(使用和被使用),依赖注入技术就是将被使用者对象给使用者对象传进去.
  *1)setter方式注入(推荐)
     a.在使用者中,定义"接口类型"的变量和setter方法
     b.在spring容器配置中,添加<property name="属性" ref="要注入的对象名">
  2)构造方式注入
    a.在使用者中,定义"接口类型"的变量和带参数的构造方法
    b.在spring容器配置中,添加<constructor-arg index="参数索引" ref="要注入的对象名"/>
*2.IOC
  IOC Inversion Of Controll 反向控制,控制转移
  在Spring中利用DI技术,实现了IOC机制,将两个组件解耦.
  控制权:可以指定调用关系,可以创建对象,可以管理和释放对象.
  一般编程,使用者具有控制权,可以指定调用哪个组件,负责创建对象这些工作;但是基于Spring框架之后,
  使用者控制权转移到了Spring容器,由Spring容器负责这些工作.
   采用了IOC之后,如果底层组件(DAO)发生替换,只要修改Spring容器的配置,不需要修改上层组件(Action),
   将组件进行了解耦,增强了程序结构的灵活性.
  
3.各种类型值注入的格式
   1)基本类型值的注入格式
     <property name="size">
<value>15</value>
     </property>
   *2)Bean对象的注入格式
     <property name="userDao" ref="userdao">
     </property>
   3)集合类型值的注入格式
    List,Set,Map,Properties类型注入格式


4.组件自动扫描(了解)
   此功能从spring2.5开始支持,因为2.5开始基于jdk5.0,从jdk5.0开始有了注解技术.
   利用该技术,可以将指定package下的组件,自动扫描纳入到spring容器中.避免在xml中编写大量<bean>元素
   使用方法如下:
    1)在spring的xml配置中,引入context命名空间
    2)利用<context:component-scan>元素
       <context:component-scan base-package="包路径"/>
    3)如果发现包中的类,类定义前面有以下注解,将纳入spring容器,id名默认采用类名(首字母小写).
       @Controller :扫描控制层组件的注解标记,例如Action
       @Service :扫描业务层组件的注解标记,例如Service
       @Repository :扫描数据访问层组件的注解标记,例如DAO
       @Component :其他组件
      如果需要自定义id名,可以采用@Controller("id自定义名")
    4)属性注入注解
      在变量定义前,使用@Resource注解标记,spring默认会采用类型匹配原则将符合的bean对象注入进来.
      如果按指定id名注入bean对象,可以使用
@Resource(name="bean对象的id名").
      注入还可以使用@Autowired,如果需要注入指定名的bean对象.
@Autowired
@Qualifier("hibernateUserDAO")
     注意:setter方法可以不写,将来spring自动生成.
     5)其他注解
       @Scope("prototype")//等价于<bean scope="prototype">
       @PostConstruct//等价于<bean init-method>
       @PreDestroy//等价于<bean destroy-method>


1.AOP的概念及优点
  Aspect Oriented Programming面向方面编程.
  面对象编程的关注点是对象,面向方面编程以面向对象编程为基础,关注点是切面,切面组件可以作用在若干目标对象的方法上,封装了具有通用性的一些处理.例如日志记录,事务处理,异常处理等等.
  面向方面编程优点:将共通处理封装成了一个独立组件,利用配置形式作用在了某一批目标对象上,实现组件的重复利用,将切面和目标对象解耦,实现了低耦合应用.
   *a.切面(Aspect)
     封装了共通处理的组件,可用于切入到目标对象的处理方法中
   *b.切入点(Pointcut)
     用于指定目标对象和方法的一个表达式.是连接点的集合.
     连接点是切面组件与某一个目标对象方法的作用点,例如方法调用和异常发生
   *c.通知(Advice)
     用于指定切面功能切入目标对象方法的位置.例如切入到目标方法调用之前,目标方法调用之后等.
     通知类型:前置通知,后置通知,环绕通知,最终通知,异常通知
     try{
        //执行前置通知<aop:before>
        //执行环绕通知--前置<aop:around>
        执行目标对象方法
        //执行环绕通知--后置
        //执行后置通知<aop:after-returnning>
     }catch(Exception ex){
        //执行异常通知<aop:after-throwing>
     }finally{
        //执行最终通知<aop:after>
     }


   d.目标对象(Target)
     需要使用切面功能的,被切入的Bean对象.使用切入点表达式指定
   e.动态代理(AutoProxy)
     在Spring采用了AOP之后,从容器取出的目标对象是一个动态代理类型,调用代理对象方法时,代理对象会调用切面功能和目标对象功能.
     动态代理类生成技术:
      有接口的目标对象采用JDK Proxy技术.
      没有接口的目标对象采用CGLIB技术.
2.切入点表达式的定义
   1)方法限定execution
      execution(修饰符? 返回类型 方法名(参数类型) throws 异常?)  
     a.匹配com.tarena.UserDAO的save()方法
       execution(* com.tarena.UserDAO.save(..))
     b.匹配com.tarena.UserDAO的所有方法
       execution(* com.tarena.UserDAO.*(..))
     c.匹配com.tarena.UserDAO的所有public void方法
       execution(public void com.tarena.UserDAO.*(..))
     d.匹配com.tarena包下所有类型的所有方法
       execution(* com.tarena.*.*(..))
     e.匹配com.tarena包下及其子包所有类型的所有方法
       execution(* com.tarena..*.*(..))
     f.匹配UserDAO中有一个参数并且是String类型的方法
       execution(* com.tarena.UserDAO.*(java.lang.String))
  2)类型限定within
    within(类型)
    a.匹配com.tarena.UserDAO的所有方法
       within(com.tarena.UserDAO)
    b.匹配com.tarena包下的所有类的所有方法
      within(com.tarena.*)
    c.匹配com.tarena包下及其子包的所有类的所有方法
      within(com.tarena..*)
  3)id名限定bean
     bean(idOrName属性值)
    a.匹配容器中所有id或name属性值以dao结尾的bean对象
       bean(*dao)




1.Spring与Struts2整合(方法二推荐使用)结构图参考ssh2-1.jpg
 特点:将Service,DAO组件都交给Spring容器管理.Action交给StrutsSpringObjectFactory创建,并且利用spring容器中的Bean对象给Action属性注入.默认按名称匹配原则注入.
  1)在web.xml中配置ContextLoaderListener(参考整合方法一)
  2)引入了Struts2和Spring整合的开发包.
  注意:在编写Action组件时,如果某个属性需要使用Spring容器Bean对象,该属性名要与Spring容器中<bean>元素的id值保持一致,因为默认是按名称匹配原则注入.如果名称不一致还要注入,可以修改default.properties中的参数设置,改为按类型匹配注入.在struts.xml中添加以下定义
<constant name="struts.objectFactory.spring.autoWire"
value="type"/>
2.Spring的事务管理
   1)编程式事务管理方式(基于编码实现,了解)
public Object someServiceMethod() {
    return transactionTemplate.execute(
      new TransactionCallback() {
      // the code in this method executes in a transactional context
      public Object doInTransaction(TransactionStatus status) {
        updateOperation1();
        return resultOfUpdateOperation2();
      }
    });
  }




   2)声明式事务管理方式(基于配置实现,推荐使用)
     a.首先定义一个事务管理bean
     jdbc访问数据库的事务管理bean,(需要注入dataSource):
org.springframework.jdbc.datasource.DataSourceTransactionManager
     hibernate访问数据库的事务管理bean(需要注入sessionFactory):
org.springframework.orm.hibernate3.HibernateTransactionManager
     b.引入tx命名空间,定义事务管理通知
    <tx:advice id="txAdvice" transaction-manager="txManager">
       <tx:attributes>
  <tx:method name="save*" propagation="REQUIRED"/>
            ......
        <tx:attributes>
    </tx:advice>
     c.添加aop配置,将事务通知切入到目标对象
 <aop:config>
  <aop:pointcut id="daocut" 
                    expression="within(com.tarena.dao.impl.*)"/>
  <!-- advisor是通知和切入点的结合体 -->
  <aop:advisor advice-ref="txAdvice" 
  pointcut-ref="daocut"/>
 </aop:config>


 Spring中常用事务类型:
REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与REQUIRED类似的操作。
拥有多个可以回滚的保存点,内部回滚不会对外部事务产生影响。只对DataSourcManager有效


3.利用注解方式整合ssh2
  1)注解方式管理事务
  a.在Spring容器配置中,添加以下配置,启用事务注解
     <!-- 启用注解方式管理事务 -->
      <tx:annotation-driven 
  transaction-manager="txManager"/>
  b.在目标对象类定义或方法定义前,使用@Transactional
  2)组件自动扫描功能  
   <context:component-scan base-package="com.tarena"/>
    @Repository,@Service,@Component,@Controller
    @Resource,@AutoWired
  3)AOP注解
    <aop:aspectj-autoproxy/>
    @Aspect,@PointCut,@Around,@AfterThrowing等
  4)Spring配置文件可以拆成若干个.例如示例拆成
    applicationContext-base.xml
    applicationContext-annotation.xml


   在web.xml中,定义spring容器实例化部分修改文件引用
<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:applicationContext-*.xml</param-value>
</context-param>
  
*1.SSH2整合关键步骤(重点)
  1)客户发请求,请求首先进入Struts2框架
    --检查web.xml是否配置Struts2控制器
  2)控制器要根据struts.xml进行请求的处理
    --检查struts.xml配置文件<action>元素
  3)控制器要调用Action对象的execute处理请求
    --检查struts-spring-plugin.jar整合插件包是否引入
  4)整合插件负责创建Action对象,访问Spring容器,将容器中的Service对象给Action对象注入.
    --检查Action对象属性与Spring容器中Service的<bean>定义的id是否一致
  5)Spring容器负责创建Service对象,将DAO对象给Service注入.
    --检查applicationContext.xml容器配置
    --检查Service组件的<bean>定义,以及注入DAO配置
    --检查DAO组件的<bean>定义,以及sessionFactory配置
    --检查sessionFactory组件<bean>定义,以及dataSource配置
   6)Spring容器需要在Tomcat启动时创建
     --检查web.xml,ContextLoaderLisener的定义.
2.Spring的MVC框架(了解)
  1)客户发送*.do请求
  2)请求到达web.xml声明的DispatcherServlet控制器
  3)控制器调用Spring容器中的HandlerMapping组件处理
  4)HandlerMapping负责请求和Controller处理组件的映射
  5)控制器调用请求对应的Controller组件,执行约定处理方法.
  6)Controller处理完毕,返回ModelAndView组件对象
  7)ModelAndView负责封装模型数据(request)和响应视图名
  8)控制器调用视图解析器ViewResolver,寻找对应的JSP视图
  9)在JSP响应视图中可以利用标签和EL获取模型数据显示.


3.Spring框架的体系结构(了解)
  Spring主要由6个模块构成.
  a.Core模块:IoC容器,提供IoC控制服务.
  b.AOP模块:提供AOP控制服务.
  c.DAO模块:提供整合JDBC技术的服务,提供JDBC事务管理
  d.ORM模块:提供整合ORM技术的服务,提供事务管理
  e.Web模块:提供SpringMVC,整合其他Web框架的服务.
  f.JavaEE模块:提供整合JavaEE服务.例如JMS消息服务等


















   











  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值