spring归纳总结(理论)

spring拾遗(二)——NamedJdbcTemplate使用归纳 有的时候用NamedJdbcTemplate会忽然想不起来用什么样的方法和参数,抽出点时间,写着玩玩,应该能应付绝大多数场景了 其中包含了返回对象或基本类型,批量修改的两种方法(建议第二种,但是NamedJdbcTemplate无法使用?占位符),还有批量插入返回主键(使用了原生jdbc) /** * Created by xjs on 16/11/15. * * http://blog 阅读详情

※1.spring是一个用于简化采用java语言进行企业及开发的分层框架,一个程序可以分为表现层、业务层、持久层和域层,表现层一般采用struts2,struts中的①jsp、html②form③tag标签

④actionservlet(控制器)⑤配置文件web.xml和struts.xml⑥action(二级控制器);主要工作是:

  (1) 表示逻辑(生成界面代码)

  (2) 接收请求

  (3) 处理业务层抛出的异常

  (4) 负责规则验证(数据格式,数据非空等)

  (5) 流程控制

业务层主要有spring负责,spring两大核心概念IOC(DI)和AOP,主要工作是:

  (1) 封装业务逻辑处理,并且对外暴露接口

  (2) 负责事务,安全等服务

持久层主要由hibernate负责,主要工作是:

  (1) 封装数据访问的逻辑,暴露接口

  (2) 提供方便的数据访问的方案(查询语言,API,映射机制等)

域层domain layer主要由实体model以及实体之间的关系组成,主要任务是:

  (1) 业务对象以及业务关系的表示

  (2) 处理简单的业务逻辑

  (3) 域层的对象可以穿越表示层,业务层,持久层

※2.spring的作用:

一,简化企业开发:

    ① 封装了大部分的企业级服务,提供了更好的访问这些服务的方式

    ② 提供了IOC,AOP功能的容器,方便编程

二,遵循Spring框架的应用程序,一定是设计良好的,针对接口编程,这样就简化了企业级程序的设计。

三,spring的组成:

    ① Spring Core:核心容器,BeanFactory提供了组件生命周期的管理,组件的创建,装配,销毁等功能

        SpringContext:ApplicationContext,扩展核心容器,提供事件处理、国际化等功能。它提供了一些企业级服务的功能,提供了JNDI,EJB,RMI的支持。

    ② Spring AOP:提供切面支持

    ③ Spring DAO:提供事务支持,JDBC,DAO支持

    ④ Spring ORM:对流行的O/R Mapping封装或支持

    ⑤ Spring Web:提供Web应用上下文,对Web开发提供功能上的支持,如请求,表单,异常等。

    ⑥ Spring Web MVC:全功能MVC框架,作用等同于Struts。

※3.spring的两大核心概念之一IOC(DI):

 一,  IOC是控制反转,其实和DI依赖注入是一回事,只是从宏观角度看就是IOC控制反转,从微观角度看就是DI依赖注入,当一个角色需要另一个角色的配合时,在传统的编程工作中是调用对象需要创建被调用对象的示例,但是在spring中创建被调用对象的工作就交给了spring容器,所以称之为控制反转,说白了就是原来有自己管理,现在交给别人进行管理,控制权发生了转移,就称之为控制反转,同样依赖注入就是对象的协作关系由容器来建立。

二,注入的方式有:

  (1) 基于特定接口(侵入式方案)

  (2) 基于set方法

  (3) 基于构造器

三,spring容器:

  Spring容器负责生成、组装、销毁组件,并负责事件处理、国际化等功能。

  (1) BeanFactory<interface>

    ① 核心容器,负责组件生成和装配

    ② 实现主要包括Xml BeanFactory

  (2) ApplicationContext

  (3) WebApplicationContext

  (4) ……

四,IOC的使用:

  Resource:interface,用来包装资源

  xmlBeanFactory:BeanFactory的一个实现,使用Resource对象来查找配置文件

  BeanFactory.gerBean(“BeanId”):取得以参数命名,或者Id等于参数值的一个Bean实例。

  BeanFactory(容器)在默认情况下,会采用单例方式返回对象。容器只到调用getBean方法时,才会实例化某个对象。

  (1) Spring可以采用XML或者.properties文件作配置

  (2) 配置文件(XML)

    根元素<beans>可以有多个<bean>子元素,每个<bean>代表一个需要装配的对象。

1、setter注入

  (1) 注入简单属性(String和8中基本类型)

  <beans>

    <bean id=”BeanId” class=”classpath” autowire=” ” dependency-check=” ”>

      <property name=”parameterName”>

        <value>parameterValue</value>

      </property>

    </bean>

  </beans>

  对于基本类型,Spring容器会自动作类型转换,以便赋值。

  (2) 注入对象

  <bean>

    <ref local=”BeanId”>

  </bean>

  A、让Spring容器在当前配置文件中找到相应的Bean,并调用set方法,注入该Bean。

  B、将一个Bean的定义嵌套在另一个Bean中(可读性差),被嵌套的Bean不能采用getBean()返回

  C、采用<ref bean=” ”>搜索多个配置文件来注入

  (3) 注入集合类型

    ① Set

      Set中存放字符串,对象,集合,不允许重复

    ② List

      List中可以放入字符串,对象,List

    ③ Map

      Map 有<entry>子元素来存取key,value,key只能为String

    ④ Properties

      Properties有<props>子元素

2、consctructor注入

  <bean>

    <constructor-arg>

      <value></value>

    </constructor-arg>

    <constructor-arg>

      <ref bean= “ ” />

    </constructor-arg>

  </bean>

  如果Bean属性不多,并且属性值必须要注入才能使用,则应该采用constructor注入,其他情况就要set方法注入。

  装配关系检查(Dependency checking)

  simple:检查简单类型

  ojects:检查对象类型

  all:检查所有

<bean dependency-check=“all”></bean>

自动装配(Autowring Properties)

装配方式:byName,byType,autodetect,constructor

autowire=“byName”:按照名称匹配

按照Bean的Id与属性的名称进行匹配

自动装配与手动装配可以结合使用,手动装配会覆盖自动装配。

autowire=“byType”:按照类型匹配

要注入的属性类型与配置文件中的Bean类型匹配的个数超过一个,会出错。

autowire=“antodetect”:

先按照construct,后按照byType。

autowire=“constructor”:

先去匹配构造器中参数类型,后与配置文件中的Bean类型匹配。

3、比较两种注入方式

关于自动匹配:

    优点:快速开发

    缺点:依赖关系不清楚,易出错,不易维护。

自动匹配的应用场合:

    (1) 构建系统原型

    (2) 与依赖关系检查(Dependency-check)结合使用

    (3) 自动装配与手动装配结合

4、特殊的IoC

   ① 后处理Bean 

接口:org.springframework.beans.factory.config.BeanPostProcessor

  Spring已经实现该接口的BeanPostProcessor(不用再注册)

  ApplicationContextAwareProcessor:

  把应用上下文传递给所用实现了 ApplicationContextAware接口的Bean

  ApplicationContextAware接口使用举例,可参照事件监听机制

  DefaultAdvisorAutoProxyCreator自动对Bean应用切面

② Bean工厂后处理(只能在应用上下文中使用)

  接口:org.springframework.beans.factory.config.BeanFactoryPostProcessor

  Spring内部接口实现:

org.springframework.beans.factory.config.PropertyPlaceholderConfigurer

属性编辑  

org.springframework.beans.factory.config.CustomEditorConfigurer

CustomerInfo("fname-lname-address")  

实例工厂配置

代码:

<beans>

<bean id="car" class="ioc3.Car" factory-bean="carFactory" factory-method="getCar" dependency-check="all">

<property name="name">

<value>奥迪A8</value>

</property>

<property name="price">

<value>800000.0</value>

</property>

</bean>

<bean id="carFactory" class="ioc3.CarFactory"/>

</beans>

静态工厂配置

<beans>

<bean id="car" class="ioc3.CarFactory" factory-method="getCar">

<property name="name">

<value>奥迪A8</value>

</property>

<property name="price">

<value>800000.0</value>

</property>

</bean>

</beans>

5、事件处理

事件监听

  1)自定义事件,通过继承org.springframework.context.ApplicationEvent

  2)自定义监听器,实现 org.springframework.context.ApplicationListener,并注册

  3)发布事件,为得到应用上下文,

  必须实现org.springframework.context.ApplicationContextAware接口

※4.spring核心概念之二(AOP)

一、AOP(Aspect-oriented programming,面向切面编程):

  什么是AOP?

  定义:将程序中的交叉业务逻辑提取出来,称之为切面。将这些切面动态织入到目标对象,然后生成一个代理对象的过程。

二、AOP核心概念

  1、Aspect(切面)

  切面,是对交叉业务逻辑的统称。

  2、Joinpoint(连接点)

  连接点,指切面可以织入到目标对象的位置(方法,属性等)。

  3、Advice(通知)

  通知,指切面的具体实现。

  4、Pointcut(切入点)

  切入点,指通知应用到哪些类的哪些方法或属性之上的规则。

  5、Introduction(引入)

  引入,指动态地给一个对象增加方法或属性的一种特殊的通知。

  6、Weaving(织入)

  织入,指将通知插入到目标对象。

  7、Target(目标对象)

  目标对象,指需要织入切面的对象。

  8、Proxy(代理对象)

  代理对象,指切面织入目标对象之后形成的对象。

三、Spring AOP原理

  采用动态代理模式。

 Spring AOP采用动态代理的过程:

(1) 将切面使用动态代理的方式动态织入到目标对象(被代理类),形成一个代理对象;

(2) 目标对象如果没有实现代理接口,那么Spring会采用CGLib来生成代理对象,该代理对象是目标对象的子类;

(3) 目标对象如果是final类,并且也没实现代理接口,就不能运用AOP。

四、Spring的通知

1、Spring的通知类型

(1) MethodBeforeAdvice

  类全名:org.springframework.aop.MethodBeforeAdvice

  在方法调用之前,做处理。

  不能够改变返回值

  不能够改变目标方法的流程,也不能中断流程的处理过程(除非抛出异常)

(2) AfterReturningAdvice

  类全名:org.springframework.aop.AfterReturningAdvice   

在方法调用之后,做处理。

  不能够改变返回值

  不能够改变目标方法的流程,也不能中断流程的处理过程(除非抛出异常)

(3) MethodInterceptor

  类全名:org.aopalliance.intercept.MethodInterceptor

在方法调用之前以及之后,做处理。

  可以改变返回值,也可以改变流程。

(4) ThrowsAdvice

  类全名:org.springframework.aop.ThrowsAdvice

在方法抛出异常后,做处理。

  当该通知处理完异常后,会简单地将异常再次抛出给目标调用方法。

2、配置过程:

  (1)配置目标对象

  (2)配置通知

  (3)利用ProxyFactoryBean将通知织入到目标对象,形成一个动态代理对象

  (4)客户端使用动态代理来访问目标对象的方法。

在默认情况下,通知会应用到所有的方法之上。

Pointcut:

根据方法和类决定在什么地方织入通知

  Advisor:

  将Pointcut与Advice结合到一起。

自定义切入点:

  步骤:

  1)实现org.springframework.aop.ClassFilter

  2)实现org.springframework.aop.MethodMatcher

  3)实现org.springframework.aop.Pointcut

  4)实现org.springframework.aop.PointcutAdvisor

 注意:

  在此可定义

  private Advice advice;

  private Pointcut pointcut;

  在配置文件中,将自定义的切入点与通知绑订到一起

 5)利用ProxyFactoryBean将advisor织入到目标对象

ProxyFactoryBean的作用:

  依照配置信息,将切面应用到目标对象,生成动态代理对象。

 (1) Spring只支持方法连接点,不支持属性连接点。

(原因是Spring AOP采用的是动态代理模式,而动态代理本身就是在方法调用前加入代码。)

  (2) Spring只在运行时,将切面织入到目标对象。

(有些AOP实现,可以在编译时织入切面到目标对象。)

Injecting Advice(con’t d)

<bean id=”registerService'' class=”org.springframework.aop.framework.ProxyFactoryBean”>

  <property name=”proxyInterfaces”>  ←目标对象实现的接口

          (如果没有定义接口,则所有方法使用CGLib

  <value>aop.RegisterService</value>

  </proxy>

  <property name=”target”>    ←目标对象

  <ref local=”registerServiceTarget”/>

  </property>

  <property name=”interceptorNames”> ←需要织入到目标对象的切面

  <list>

    <value>logAdvice</value>

    <value>throwsAdvice</value>

  </list>

  </property>

</bean>

五、切入点(Pointcut)

  1、Pointcut<interface>

  切入点是指通知/切面可以应用到哪些类,哪些方法之上。

  Pointcut API

  Pointcut:org.springframework.aop.Pointcut

对某些类某些方法应用切面。

  Classfilter:org.springframework.aop.ClassFilter

用来过滤类(哪些类可以应用切面)

  MethodMather:org.springframework.aop.MethodMatcher

用来过滤方法(类中哪些方法应用切面)

  Advisor:org.springframework.aop.PointcutAdvisor

将Pointcut与Advice结合到一起

  配置文件样例:

<beans>

<bean id="registerServiceTarget" class="aop5.RegisterService"/>

<bean id="logAdvice" class="aop5.LogAdvice"/>

<bean id="myPointcut" class="aop5.MyPointcut"/>

<bean id="myPointcutAdvisor" class="aop5.MyPointcutAdvisor">

  <property name="advice">

  <ref local="logAdvice"/>

  </property>

  <property name="pointcut">

  <ref local="myPointcut"/>

  </property>

</bean>

<bean    id="registerService" class="org.springframework.aop.framework.ProxyFactoryBean">

  <property name="target">

  <ref local="registerServiceTarget"/>

  </property>

  <property name="interceptorNames">

  <list>

    <value>myPointcutAdvisor</value>

  </list>

  </property>  

</bean>

</beans>

2、预定义切入点

  ① 静态切入点:

a、NameMatchMethodPointAdviosr

  org.springframework.aop.support.NameMatchMethodPointcutAdvisor

  根据方法名称的特点进行匹配

核心XML:mappedName→advice(ref)

配置文件样例:

<beans>

  <bean id="registerServiceTarget" class="aop6.RegisterService" />

  <bean id="logAdvice" class="aop6.LogAdvice" />

<bean      id="namedPointcutAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">

  <property name="mappedName">

    <value>methodOne</value>

  </property>

  <property name="advice">

    <ref local="logAdvice"/>

  </property>

  </bean>

  <bean id="registerService"

  class="org.springframework.aop.framework.ProxyFactoryBean">

  <property name="target">

    <ref local="registerServiceTarget" />

  </property>

  <property name="interceptorNames">

    <list>

    <value>namedPointcutAdvisor</value>

    </list>

  </property>

  </bean>

</beans>

b、RegexpMethodPointcutAdvisor

根据正则表达式匹配方法名

  org.springframework.aop.support.RegexpMethodPointcutAdvisor

  核心XML:pattern→advice(ref)

配置文件样例:

<beans >

  <bean id="registerServiceTarget" class="aop6.RegisterService" />

  <bean id="logAdvice" class="aop6.LogAdvice" />

<bean    id="regexpAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">

  <property name="pattern">

    <value>.*method.*</value>

  </property>

  <property name="advice">

    <ref local="logAdvice"/>

  </property>

  </bean>

  <bean id="registerService"

  class="org.springframework.aop.framework.ProxyFactoryBean">

  <property name="target">

    <ref local="registerServiceTarget" />

  </property>

  <property name="interceptorNames">

    <list>

    <value>regexpAdvisor</value>

    </list>

  </property>

  </bean>

</beans>

②  动态切入点:

  org.springframework.aop.support.ControlFlowPointcut

③ 切入点的交叉与合并:

  Pointcuts.union

配置文件样例:

<bean id="unionPointcut" class="aop7.UnionPointcut">

  <property name="pointcuts">

  <list>

  <ref local="myPointcut"/>

  <ref local="otherPointcut"/>

  </list>

  </property>

</bean>

<bean id="myPointcutAdvisor" class="aop7.MyPointcutAdvisor">

<property name="advice">

  <ref local="logAdvice"/>

</property>

<property name="pointcut">

  <ref local="unionPointcut"/>

</property>

</bean>

④ Introduction

  一种特殊类型的Advice,为类动态增加方法和属性。

  编程步骤:

  1)实现org.springframework.aop.IntroductionInterceptor或

  继承org.springframework.aop.support.DelegatingIntroductionInterceptor

  2)使用org.springframework.aop.support.DefaultIntroductionAdvisor

配置文件样例:

<bean id="myIntroInterceptor" class="aop8.MyIntroductionInterceptor"/>

<bean      id="myIntroInterceptorAdvisor" class="org.springframework.aop.support.DefaultIntroductionAdvisor">

  <constructor-arg>

    <ref local="myIntroInterceptor"/>

  </constructor-arg>

  <constructor-arg>

    <value>aop8.OtherBean</value>

  </constructor-arg>

  </bean>

六、自动代理

Spring在生成代理对象的时候,默认情况下,会使用被代理对象的接口来生成代理对象。

  如果被代理对象没有实现接口,此时,Spring会使用CGLIB生成代理对象,此时该代理对象是被代理对象的子类。

a、BeanNameAutoProxyCreator

org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator

  根据类的名称来为符合相应名称的类生成相应代理对象。

 beanNames(list),interceptorNames

配置文件样例:

<bean    id="namedProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">

<property name="beanNames">

  <list>

  <value>someService</value>

  <value>otherService</value>

  </list>

</property>

<property name="interceptorNames">

  <list>

  <value>logAdvice</value>

  </list>

</property>

</bean>

b、DefaultAdvisorAutoProxyCreator

 org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator

  自动将Advisor与匹配的Bean进行绑定

  只能与Advisor配合使用

  配置文件样例:

<bean  id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

※5.Spring对持久层的支持① JDBC,② O/R Mapping(Hibernate,TopLink等)

一、Spring对持久层支持采用的策略:

  1、Spring对持久层“不发明重复的轮子”,即没有重新实现新的持久层方案,对现有持久层方案做封装,更利于使用。

  2、采用DAO模式

  3、提供了大量的模板类来简化编程(HibernateDaoSupport,JdbcTemplate等)

  4、重新设计了一套完善的异常体系结构

    ① 类型丰富,细化异常类型

    ② 全都是运行时异常(RuntimeException)

二、Spring对JDBC的支持

  1、配置数据源

    方式一:采用Spring内置的数据源,Spring内置实现 DriverManagerDataSource

<bean id="dataSource"   class="org.springframework.jdbc.datasource.DriverManagerDataSource">

         <property name="driverClassName">

         <value>com.mysql.jdbc.Driver</value>

         </property>

         <property name="url">

         <value>jdbc:mysql://localhost:3306/hibdb</value>

         </property>

         <property name="username">

         <value>root</value>

         </property>

         <property name="password">

         <value>windows</value>

         </property>

       </bean>

 方式二:采用开源数据库产品如DBCP

DBCP提供的BasicDataSource

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">

    <property name="driverClassName">

      <value>com.mysql.jdbc.Driver</value>

    </property>

    <property name="url">

      <value>jdbc:mysql://localhost:3306/hibdb</value>

    </property>

    <property name="username">

      <value>root</value>

    </property>

    <property name="password">

      <value>windows</value>

    </property>

    </bean>

方式三: 直接使用容器提供的数据源(如Tomcat,Weblogic,Sun Application Server)

    JNDI数据源:(mysql5,tomcat5.5)

       step1:

       在server.xml中:

       <Resource name="jdbc/mydatasource" auth="Container" description="DB Connection" 

    type="javax.sql.DataSource" username="root" password="windows" 

    driverClassName="com.mysql.jdbc.Driver" 

    url="jdbc:mysql://localhost:3306/tarena" maxActive="5" />

    step2:

    在context.xml中(conf\context.xml):

    <ResourceLink   name="jdbc/mydatasource"        global="jdbc/mydatasource"   type="javax.sql.DataSourcer"/> 

    step3:

    在beans-config.xml:

    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">

        <property name="jndiName">

          <value>java:comp/env/jdbc/mydatasource</value>

        </property>

      </bean>

2、配置JdbcTemplate模板类(封装了绝大多数数据库操作)

3、配置DAO

4、配置Service

编程步骤:

step1:  配置数据源

step2: 配置JdbcTemplate

    <bean id="jdbcTemplate"

    class="org.springframework.jdbc.core.JdbcTemplate">

    <property name="dataSource">

      <ref bean="dataSource" />

    </property>

    </bean>     

step3:配置DAO

    <bean id="orderDao" class="lab5.OrderDAOImpl">

    <property name="jt"><ref bean="jdbcTemplate"/></property>

    </bean>

注意:  查询时,使用RowMapper

三、Spring对Hibernate的支持

    Step1:  配置数据源

    Step2:  配置sessionfactory

    <bean id="mySessionFactory"

      class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

      <property name="dataSource">

      <ref bean="dataSource" />

      </property>

      <property name="mappingResources">

      <list>

        <value>lab6/Order.hbm.xml</value>

      </list>

      </property>

      <property name="hibernateProperties">

      <props>

        <prop key="hibernate.dialect">

        org.hibernate.dialect.MySQLDialect

        </prop>

        <prop key="hibernate.show_sql">true</prop>

      </props>

      </property>

    </bean>

   Step3:  配置DAO

    <bean id="orderDao" class="lab6.OrderDAOHibernateImpl">

    <property name="sessionFactory">

      <ref bean="mySessionFactory" />

    </property>

    </bean>

    注意:以上配置是要求dao 继承HibernateDaoSupport

※6.Spring对事务的支持

一、AOP事务的含义:

  把事务当作一个切面,动态地织入到目标对象,形成一个代理对象。

二、Spring的事务机制

Spring支持声明式事务。

Spring使用事务服务代理和事务管理器(如HibernateTransactionManager)来支持事务服务。

Spring对事务的边界多了一种嵌套事务(PROPAGATION_NESTED)。

PROPAGATION_NESTED:

如果客户端启动了事务T1,那么Bean启动一个嵌套在T1中的子事务T2;

如果客户端没有启动事务,那么Bean会启动一个新的事务,类似于REQUIRED_NEW

三、Spring中事务的使用

  1、Spring中使用Hibernate事务

    Step1:配置数据源

    Step2:配置sessionfactory (同上)

    Step3:配置事务管理器

    <bean id="myTransactionManager"

    class="org.springframework.orm.hibernate3.HibernateTransactionManager">

    <property name="sessionFactory">

      <ref bean="mySessionFactory" />

    </property>

    </bean>  

  Step4:创建事务服务代理

    <bean id="saleService"

    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

    <property name="proxyInterfaces">

    <value>lab7.SaleService</value>

    </property>

    <property name="transactionManager">

    <ref bean="myTransactionManager" />

    </property>

    <property name="target">

    <ref bean="saleServiceTarget" />

    </property>

    <property name="transactionAttributes">

    <props>

      <prop key="*">PROPAGATION_REQUIRED</prop>

    </props>

    </property>

  </bean>

事务属性描述格式:

传播行为,隔离级别,只读事务(read-only),回滚规则

在默认情况下,Spring的容器对于非受查异常(服务模块中抛出的非受查异常),会回滚事务。对于受查异常,会提交事务。

如果即使发生了某种受查异常,也要回滚事务,可以用  “- 异常类型“来声明。同样,对于非受查异常,如果不要求回滚事务,可以用"+异常类型"来声明。

如何简化事务配置?

    使用继承(抽象的Service类)、自动代理。

四、Spring事务与EJB事务

  1、EJB事务:

EJB的CMT管理事务方式,只能设置事务边界(传播行为),对于隔离性是不能设置的,并且EJB不支持嵌套事务。

2、Spring事务:

对于Spring来说, Spring的声明式事务可以设置事务边界(传播行为),设置隔离级别,设置只读事务,回滚规则(+:对于任何异常都提交,-:对于任何异常都回滚)

<property name=”transactionAttributes”>

  <props>

    <prop key=”*”>+异常类型1,-异常类型2</prop>

</property>

PS:Spring对嵌套事务的支持依赖与数据库底层对嵌套式事务的支持。

※7.SSH整合

一、SSH:

Struts(表示层)+Spring(业务层)+Hibernate(持久层)

Struts:

Struts是一个表示层框架,主要作用是界面展示,接收请求,分发请求。

在MVC框架中,Struts属于VC层次,负责界面表现,负责MVC关系的分发。(View:沿用JSP, HTTP,Form,Tag,Resourse ;Controller:ActionServlet,struts-config.xml,Action)

Hibernate:

Hibernate是一个持久层框架,它只负责与关系数据库的操作。

Spring:

Spring是一个业务层框架,是一个整合的框架,能够很好地黏合表示层与持久层。

① Web分层架构中业务层为什么都选择Spring?

Service层需要处理业务逻辑和交叉业务逻辑,处理事务,日志,安全等,而这些与Spring的IoC,AOP等不谋而合。

② Web分层架构中,对于各层技术的采用应该遵循一个怎样的标准?

1、选择发展成熟的技术:

  A、经过了项目实践证实可行性良好

  B、文档完善

  C、技术一直处于可持续发展更新

2、Web应用中对于技术的选择有赖于开发人员的技术掌握情况

二、Spring与Struts整合

  前提:

    必须在Web应用启动时,创建Spring的ApplicationContext实例

  方式:

    1、采用ContextLoaderListener来创建ApplicationContext:

    <context-param>

     <param-name>contextConfigLocation</param-name>

    <param-value>

      /WEB-INF/spring-config/applicationContext.xml

    </param-value>

    </context-param>

    <listener>

    <listener-class>

      org.springframework.web.context.ContextLoaderListener

    </listener-class>

    </listener>

    2、采用ContextLoaderPlugIn来创建ApplicationContext

    <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">

       <set-property  property="contextConfigLocation" value="/WEB-INF/config/sale.xml" />

    </plug-in>

  或者: 通过listener装载spring应用上下文

方式一:通过Spring的ActionSupport类

  ActionSupport类:

  知道ApplicationContext的获得方式。

  步骤:

  1、Action直接继承ActionSupport

  2、使用ApplicationContext ctx = getWebApplicationContext();取得Spring上下文

  3、取得相应Bean

  注意:有可能需要替换commons-attributes-compiler.jar包。

  优点:

    简单

  缺点:

    耦合高

    违反IOC

    无法使用多方法的Action

方式二:通过Spring的DelegatingActionProxy类

  步骤:

  1、Action中,使用IOC获得服务

  2、配置struts-config.xml

    <action path="/somepath" type="org.springframework.web.struts.DelegatingActionProxy"/>

  3、在Spring配置文件中

    <bean name="/somepath" class="SomeAction">

    <property name="service"><ref bean=""/>

    </bean>

    注意,要用bean name命名。

    /somepath:Action的path

  优点:

  不使用Spring api编写 Action

  利用了IOC装配。

  可以利用容器的scope="prototype"来保证每一个请求有一个单独的Action来处理,

  避免struts中Action的线程安全问题。

  缺点:

  struts配置文件中,所有path都映射到同一个代理类

方式三:通过Spring的DelegatingRequestProcessor类

  步骤:

  1、Action中,使用IOC获得服务

  2、配置struts-config.xml

     <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor" />

  3、在Spring配置文件中

    <bean name="/somepath" class="SomeAction">

    <property name="service"><ref bean=""/>

    </bean>

小结:

  Spring与Struts整合方式只有两种:

  (1)由Spring容器来管理Action(方式二,方式三)

  (2)Action处于容器之外(方式一)

注意:

    中文问题:

    设置过滤器,设置页面编码,数据库编码

三、关于Spring与EJB

  1、Spring与EJB3.0的对比

  Spring与EJB3.0之间的关系是竞争关系。

  ① Spring是一个开源的框架,而EJB3.0是一个标准(标准意味着将得到广泛的支持以及良好的兼容性),并且,采用EJB3.0,项目的后期维护得到了保证。

  ② Spring是一个轻量级框架,EJB3.0是一个重量级框架(完整的容器,包含所有的服务)。

  ③ Spring的IoC,AOP集成了大量的开源框架,可扩展性良好。EJB3.0的可扩展性则完全依赖于新的容器。

  ④  Spring对事务支持不如EJB3.0成熟,Spring对集群的兼容也不够。

⑤ Spring与EJB3.0都是一个企业级开发框架,都支持声明式事务。

2、Spring的优势与劣势

Spring的优势:

① 简化了企业级开发(对企业级服务进行了进一步的封装)

② 采用Spring框架的程序意味着良好的分层结构设计,并保证是面向接口编程的

③ 用IoC,AOP容器,模块是可配置的,松耦合的,方便了后期维护

Spring的劣势:

① 配置复杂,不方便维护

② 容器大量使用反射等机制装配对象,影响性能,对于高并发的大型应用无能为力。

 

 

 

 

 

 

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Spring3.X编程技术与应用,完整扫描版 【父亲生病了,求祈福,好人一生平安,谢谢】   丁振凡编著的《Spring3.x编程技术与应用》按 循序渐进的原则对Spring3.x的主要知识及应用体系 进行了较为系统的介绍,回答了应用开发者 最为关心的一些话题,目的是帮助读者快速理解和运用相关知识。 《Spring3.x编程技术与应用》紧扣新版Spring的知识内容,结合实际应用进行讲解,书中的应用样 例具有很大的实用性。全书分3篇共21章,具体内容包括:Spring环境的安装与使用、JSP与JSTL简介、 Spring基础概念与工具、用SpringJdbcTemplate访问数据库、使用Mayen工程、Spring MVC编程、基于 MVC的资源共享网站设计、Spring的AOP编程、Spring的安全访问控制、Spring的事务管理、 Spring的任务执行与调度、Spring Web应用的国际化支持、AJAX和Spring结合的访问模式、利用Spring发 送电子邮件、Spring JMS消息应用编程、教学资源全文检索设计、Java应用的报表打印、网络考试系统设 计、Spring应用的云部署与编程、SpringIntegration应用简介、基于MVC的文档网络存储服务 设计。 本书是作者近年来利用Spring进行应用开发的经验总结。适合作为软件开发人员进行项目开发时的参 考资料,同时也可作为高校本科生和研究生开设 “JavaWeb编程技术”或“Spring开发技术与应用” 课程的教 材或参考书。 立即下载

相关推荐

SAP 运费处理方式

从直接的处理方式上看,情况1/2/3可以将运费记账到物料成本中,但情况4/5/6是直接记账到成本对象中,具体是要体现在损益表中,还是要结转到物料成本中,可依据业务要求进行好处理。如果体现在损益表中,不需要多过多额外的操作,如果要体现在物料成本中心,则需要再进行一系列的处理,最终将金额结转到物料成本中。因为在创建采购订单时不知道具体运费,可以不维护运费,只需要维护材料价格。:创建采购订单时,运费是由供应商承担,很多时候是包含在材料报价中,这种情况不需要专门针对运费进行处理,材料价格中已包含运费。

weixin_44506537的博客 3371

spring全面详解-最全最详细的spring基本认识和入门使用

​ Spring是一款主流的Java EE 轻量级开源框架,目的是用于简化Java企业级引用的开发难度和开发周期。从简单性、可测试性和松耦合度的角度而言,任何Java应用都可以从Spring中受益。Spring框架提供自己提供功能外,还提供整合其他技术和框架的能力。​ Spring自诞生以来备受青睐,一直被广大开发人员作为Java企业级应用程序开发的首选。时至今日,Spring俨然成为了Java EE的代名词,成为了构建Java EE 应用的事实标准。

是程序喵呀 3万+

基于资源预测的Agent弹性伸缩:在成本与响应延迟间寻找最佳平衡点

手动伸缩:完全由运维人员人工调整副本数或服务器数量,效率极低,现在基本只用于极小规模的业务。反应式伸缩:基于当前实时监控指标触发伸缩规则,比如CPU利用率超过70%就加2个副本,是目前应用最广泛的方案,典型代表是K8s HPA、KEDA。预测式伸缩:基于历史时序数据预测未来的负载,提前进行伸缩,解决反应式伸缩的滞后性问题,典型代表是AWS Predictive Scaling、阿里云预测式HPA。智能Agent伸缩。

SuperAGI2025 134

spring理论知识大全,想要的都有,下方还有链接!!!

spring是什么? spring是开源的轻量级框架,是为解决企业应用开发的复杂性而创建的 是一个三层架构,也为J2EE应用程序开发提供集成的框架 Web层:Spring MVC; 业务层:Spring的IoC; 持久层:Spring的JDBC、ORM、等持久层框架; Spring的核心是控制反转(IoC)和面向切面编程(AOP) 特点? 方便解耦,简化开发 1>通过spring提供的IoC容器,我们可以将对象之间的依赖关系交由spring进行控制,避免硬编码所造成的过度程序耦合 2>有

weixin_45058888的博客 291

自定义串口通讯协议

自定义串口通讯协议的实现方法

qq_44826038的博客 2172

Floyd算法在社交网络中的应用:如何找到六度人脉的最短路径?

本文探讨了Floyd算法在社交网络分析中的核心应用,特别是如何利用该算法高效计算任意两人之间的最短路径,从而量化“六度人脉”理论。文章通过构建微型社交网络模型,详细拆解了Floyd算法的动态规划原理与代码实现,并展示了如何从计算出的最短路径距离矩阵中挖掘节点中心性、识别社群等关键洞察,为社交推荐、影响力分析等场景提供技术支撑。

blockchain9miner的博客 1002

最全最详细的 Spring 基本认识和入门使用

Spring全面详解:最全最详细的Spring基本认识和入门使用

南辞的博客 1315

SEED-VII 实战指南:如何利用多模态脑电图数据提升情感识别精度

本文提供了SEED-VII多模态脑电图数据集的实战指南,详细介绍了如何利用该数据集提升情感识别精度。内容涵盖数据获取、预处理、特征提取,以及构建多模态融合神经网络模型的关键步骤,并强调了被试者独立评估的重要性,为情感计算研究者提供了从数据到模型的全流程解决方案。

weixin_29196891的博客 318

1.Spring设计理念(最小侵入式,依赖注入,切面)

本篇博客用实际的例子以通俗易懂的形式解释了什么是侵入式编程,什么是非侵入式编程,什么是依赖注入,以及我们为什么需要面向切面编程。

c1776167012的博客 1532

MAPLAB X IDE仿真调试

一、开发环境 操作系统:Windows 10 调试工具:Pickit3 单片机型号:PIC24FJ32GA002 二、操作步骤 1、连接Pickit3仿真器于单片机对应的烧写口如图示: 2、点击调试项目进入调试模式,这时底下输出框显示"运行"代表成功进入调试模式。 3、选择断点,该IDE只支持两个断点,使用超过两个时,超过的断点亮灰色代表无效。设置好断点后需暂停然后再重新点击运行才能生效。可以看到在断点处有绿色光标。 ...

RealHero的博客 5084

用生成式AI自动生成测试用例的完整教程

本文旨在帮助测试工程师、开发人员快速掌握“生成式AI自动生成测试用例”的核心技术,覆盖从概念理解、工具选择到实战落地的全流程。无论是Web应用、API接口还是移动端功能测试,你都能找到可复用的方法。本文将按照“概念→原理→实战→避坑”的逻辑展开:先通过生活案例理解生成式AI如何生成测试用例,再拆解核心算法原理,接着用Python代码演示完整生成流程,最后分享实际应用中的优化技巧和未来趋势。生成式AI:能“创造内容”的AI模型(如ChatGPT、CodeLlama),像会写作文的智能笔。测试用例。

AIGC应用创新大全的博客 1580

Spring全面详解

Spring是个Java企业级应用JavaEE(13种规范)的开源开发框架。Spring主要用来开发Java应用,是针对构建JavaEE平台的web应用。

White-Camellia 4721

自己的搭建的slam机器人建图导航测试

1、前言 这里是对自己搭建的slam机器人建图导航的功能测试,原本并不想写这一篇的,因为每个小伙伴的需求都不一样,但是发现还是有同学有需求,于是就有了这一篇。本篇属于说明分享类文章,不涉及细节解释。按照步骤操作即可。 本次测试需要建图算法my_slam_gmapping、导航框架navigation、以及explore_lite功能包、mbot_teleop键盘控制功能包等。 环境:ubuntu mate 16.04 + ROS Kinetic 功能包下载:在公众号:小白学移动机器人,发送:建图导航测试,即

「小白学移动机器人」一个专注分享移动机器人相关知识的公众号! 8700

Spring归纳小结

比如,采用注解方式的话,就更加简单了,先在XML中开启AOP(),然后在增强方法上直接使用类似@Before(value=“execution(具体的表达式)”)即可;交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。)提供了不同的事务实现类。

m0_54828003的博客 190

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

《Spring Boot 知识归纳与学习方法》

在当今的 Java 开发领域,Spring Boot 无疑是一个非常强大且流行的框架。它简化了 Spring 应用的开发过程,让开发者能够更加专注于业务逻辑的实现。本文将对 Spring Boot 的知识进行归纳,并分享一些有效的学习方法,同时还会加入一些 Spring Boot 项目实战案例。总之,学习 Spring Boot 需要掌握基础知识,通过实践项目加深理解,并不断深入学习高级特性。通过这些实战案例,你可以更好地理解 Spring Boot 的应用场景和开发方法。

zwz_30的博客 1182

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Spring5归纳

1. Spring 1.1 简介 Spring —> 给软件行业带来春天 2002, 首次推出了Spring框架的雏形: interface21框架! Spring框架即以interface21框架为基础,经过重新设计 ,并不断丰富其内涵,于2004年3月24日发布了1.0正式 Rod Johnson,Spring Framework创始人,著名作者。很难想象Rod Johnson的学历,真的让好多人大吃一惊,他是悉尼大学的博士,然而他的专业不是计算机,而是音乐学。 spring理

愿你有前程可奔赴,亦有青春可回顾 1025

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Spring知识点总结归纳。

Spring 此文章部分引用java3y的《三歪教你Spring》; 简介: Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。 Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。Spring可以单独应用...

Meetsummer的博客 593

Spring归纳总结

1、Spring是什么? Spring是一个轻量级的IoC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。主要包括以下七个模块: Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等); Spring Core:核心类库,所有功能都依赖于该类库,提供IOC和DI服务; Spring AOP:AOP服务; Spring Web:提供了基本的面向Web的综合特性,提供对常见框架如Stru

qq_25073261的博客 878

spring aop原理_Spring IoC、AOP、Transaction、MVC 归纳小结

前言Spring的一些概念和思想关于IOC关于AOPSpring与web整合的原理《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品合集》《Spring MVC 实现原理与源码解析 —— 精品合集》《Spring Boot 实现原理与源码解析 —— 精品合集》《数据库...

weixin_39592026的博客 92

Spring Cloud各组件总结归纳

前面介绍了很多Spring Cloud的组件,本篇按照自己的角度来做一次归纳。 Spring Cloud技术应用从场景上可以分为两大类:润物无声类和独挑大梁类。 润物无声,融合在每个微服务中、依赖其它组件并为其提供服务。 Ribbon,客户端负载均衡,特性有区域亲和、重试机制。 Hystrix,客户端容错保护,特性有服务降级、服务熔断、请求缓存、请求合并、依赖隔离。 Feign,声...

咖啡男孩之SRE之路 5万+
上一篇: spring面试之关于AOP和DI的理解
下一篇: struts2_core NOTE
communicate_
博客等级 码龄14年 65粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值