IOC 

 

  1.几个主要使用的application context.  

  ClassPathXmlApplicationContext  从ClassPath路径加载 

  FileSystemXmlApplicationContext  从文件系统路径加载

  XmlWebApplicationContext   配置文件黑夜在/WEB-INF/applicationContext.xml,也可以使用setConfigLocation(location)修 改。另外一定还要通过setServletContext设置ServletContext对象

2.  一个bean的生命周期

3. spring配置文件的namespace有beans,sop,context,mvc,jms,tx等,通过指定xml配置文件的schema来表明当前配置文件主要用来配置哪些

4 一个bean的scope有singleton,prototype,request,session,global-session几种

5.  spring ioc可以通过方法和属于进行注入,注入的类型可以为一个具体的值,类型可以为list,map,set,prop ,null,也可以是对另外一个bean的引用,也可以是一个inner bean,还可以是SpEL语言,比如:

  <property name=”remainder” value=”#{counter.total % counter.count}/>

 

6.  spring的autowiring的类型有byName,byType,constructor,auto detect.

7.  spring的annotations有 @Component @Controller  @Respository  @Service   @Bean  @Autowired等

     在spirng context配置中可配  <context:annotation-config />   <context:component-scan>


AOP 

aop相关概念  http://www.cnblogs.com/dlts26/archive/2013/04/17/2742628.html 

aop面向切面可以用于统一日志记录、安全控制、缓存等

spring aop只能控制到方法级别,如果需要控制到属性,构造函数级别,需要使用Aspectj.  aspject提供了自己的语言,基于java扩展的。

spring aop是在运行时注入的,对性能会有影响。而Aspectj支持编译注入。

spirng aop的可在pointcut时使用表达式,与Aspject类似。强大的表达式可指定切入哪些包的哪些类的哪些方法。

spring aop支持的Advice有befor,after,after-returning,after-throwing,around.

可传递参数到advice.

基于aop机制,可实现不修改源代码的情况下,指定类实现某接口,其接口的方法由哪个类来实现,实际上这个时候bean由proxy拦截了调用.

基于annotation能够减少大量的代码的情况下,方便的实现aop声明.


database

Spring基于模板方法的Template机制,把大量重复不变的数据库连接,异常处理等封装起来,而让spring只需要简单的处理业务相 关的数据访问。Spring DAO对不同的数据实现的异常进行了高度集成,这样在使用Hibernate,JPA等框架的时候,顶层不需要耦合其提供的异常信息 

 

在生产环境中一定要使用基于缓存池pool的datasource机制,如果能使用JNDI,尽量使用JNDJ数据源,能够充分利用app server提供的缓存池,而且易于监控

Spring针对不同的持久层机制提供了不同的Template以及不同的DAO Support classes.

选择的持久层机制要充分考虑到性能,Hibernate后续提升性能不如原生JDBC方便.


Transaction

 声明式事务 程序事务,annotation事务

事务的隔离级别  isolation   http://zh.wikipedia.org/wiki/%E4%BA%8B%E5%8B%99%E9%9A%94%E9%9B%A2

Spring针对不同的底层提供不同的TransactionManger,Ibatis和Jdbc一样使用 DataSourceTransactionManger

Propagation可设置事务传递机制,是否支持事务,是否需要新创建事务等.

对应C#中的Transaction机制如下:

http://progtutorials.tripod.com/DotNetTransaction.htm
  [Transaction( TransactionOption.Supported, Isolation = TransactionIsolationLevel .Any, Timeout = 1800)] 

原理类似:

一个事务协调器transaction coordinator负责事务协调,不同的数据资源提供不同的事务接口,mysql,oracle,mssql分别都会有自己的事务机制,在一个事务执 行时,当所有的资源都返回正确时,coordiantor再让每个资源commit,如果有任何一个出现问题,都让每个资源roolback.

每个资源需要记录自己执行过的操作,以便rooback.

 


Spring MVC

 

 

1. 象其它MVC框架一样(struts2是基于filter的,struts1.x是基于servlet的),Spring MVC也是通过一个Servlet(DispatcherServlet)负责接收请求,再转发调用Spring自己的Action,Action内部执 行完成后,会返回需要显示的视图名称,DispatcherServlet会根据当前的不同的视图引擎来呈现视图.

2. DispatcherServlet需要在web.xml里配置,并且配置接受哪些请求,同时会根据名字-servlet.xml加载对应的配置文件

<servlet>

<servlet-name>spitter</servlet-name>

<servlet-class>

org.springframework.web.servlet.DispatcherServlet

</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>spitter</servlet-name>

<url-pattern>/</url-pattern>

</servlet-mapping>

对应的配置文件就是spitter-Servlet.xml

3. Spring mvc 使用基于annotation方式,大量减少代码 @Controller  @RequestMapping

4. 可对应Controller创建Test项目,结合Mock测试,@Test

5. Spring mvc前台支持不同的View Resolver ,Freemarker ,Velocity, Apache Tite,JasperReport,   InternalResolverViewResolver通常使用

6. Tite能够定义页面布局,功能强大

7. 需要在web.xml里配置ContextLoaderListener,以便能够同时加载Service层以及其它的spring配置文件。

<listener>

<listener-class>

org.springframework.web.context.ContextLoaderListener

</listener-class>

</listener>

默认去 WEB-INF目录下寻找applicationContext.xml  当然也可以通过context-param配置加载指定的多个xml

<context-param>

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

<param-value>

/WEB-INF/spitter-security.xml

classpath:service-context.xml

classpath:persistence-context.xml

classpath:dataSource-context.xml

</param-value>

</context-param>

8.Spring mvc中可以给整个Controller设置RequestMapping,规定这个Controller接受这个请求后的处理

9. 可在action的参数上直接打标签@Valid,这样能够对映射过来的实体进行验证,前台通过标签直接显示错误信息

10. 在Spring mvc中进行文件上传时,同时需要配置CommonsMultipartResolver

    <bean id=”multipartResolver” class=

“org.springframework.web.multipart.commons.CommonsMultipartResolver”

p:maxUploadSize=”500000″ />


Spring Security

1.Spring Security主要处理两种场景,一种是控制到URL级别,主要针对用户请求,基于Servlet Filter控制,另外一种是控制web invocation,基于AOP实现 

2. Securing Web Request.

   在web.xml配置spring的filter代理

<filter>

<filter-name>springSecurityFilterChain</filter-name>

<filter-class>

org.springframework.web.filter.DelegatingFilterProxy

</filter-class>

</filter>

然后在spring配置文件里配置规则:

<http>

<form-login />

<http-basic />

<logout />

<intercept-url pattern=”/**” access=”ROLE_SPITTER” />

</http>

也可以指定自己的登录界面,登录提交url,以及控制的路径,允许访问的角色

3.Spring提供了前台标签,可直接在前台读取当前登录用户的一些认证信息,也可以读取权限来区分显示一些前台内容。

4.Spring判断用户登录以及获取用户权限支持灵活的扩展,可支持配置文件,JDBC,LDAP, OpenID等

5.全局开启方法annotation安全验证

<global-method-security secured-annotations=”enabled” />

可直接利用标签通过AOP机制对方法进行安全验证。

甚至可以直接控制方法访问,通常情况下不符合的话返回异常,也支持直接退出,还可以对返回结果进行过滤

可通过实现接口PermissionEvaluator的方法hasPermission,这样在@PostFilter中可直接控制指定的权限

需要同时配置ExpressionHandler

<global-method-security pre-post-annotations=”enabled”>

<expression-handler ref=”expressionHandler”/>

</global-method-security>

<beans:bean id=”expressionHandler” class=

“org.springframework.security.access.expression.method. DefaultMethodSecurityExpressionHandler”>

<beans:property name=”permissionEvaluator”>

<beans:bean class=

“com.habuma.spitter.security.SpittlePermissionEvaluator” />

</beans:property>

</beans:bean>


Spring Remoting

 

rpc    remote  procedure call

Spring  supports   rpc   via  several  remoting   technologies: 

Remote  Method  Invocation (RMI)    firewalls aren’t  a factor

Hessian  or   Burlap

HTTP  invoker

JAX_RPC  and JAX-WS


 Rest

 

1 . 

   Rest ==  Representational State Transfer 

         Representational     =>  resources可以为多种表现形式 html  xml json等

2.  Rest Verbs   Post  Get  Delete Put  Option…

3.  Spring Mvc在Action中通过@RequestMapping   设置method控制不同的Verb,通过header要求返回的格式,

4.  可以直接通过@ResponseStatus 返回结果状态

5.

        @RequestMapping(value=”/{username}”,method=RequestMethod.GET,headers={“Accept=text/xml,application/json”})

      public  @RequestBody Spliter   GetSpliter()

         在这里springmvc或根据header的值,自动根据指定的convert返回对应的结果

6.   通过RestTemplate完成RestClient的工作

7.  submit restful form  通过设置隐藏属性_method, 值为Delete,PUT的方式,实际上还是提交的Post请求。

   通过在在 DispatcherServlet前设置 HiddenHttpMethodFilter来拦截


 JMS

 

1.系统间同步通信的问题:  synchronous communication

        a.  受服务端请求能力限制,影响client的性能

        b.   直接基于接口开发,接口变化时会产生影响

        c.  client直接指定了service的地址

        d.      client依赖于service的可用性,如果不可用时会马上受到影响

   这些问题也是asynchronous的优势

2. 可选择ActiveMQ作为Message Broker

3. 基于JMSTemplate开发message send

4.   为了解决同步receive,基于Message Listener实现消息到达时主动通知

<jms:listener-container connection-factory=”connectionFactory”>

<jms:listener destination=”spitter.alert.queue”

ref=”spittleHandler” method=”processSpittle” />

</jms:listener-container>

5.  可以把JMS和remoting service调用(rpc)相结合


JMX

 

1. 使用JMX技术可以管理Spring中的bean,比如运行时设置一个bean的属性的值, JMX+JConsole 

    同时JMX主要用于监控运行时Spring  bean的属性

2. <bean id=”assembler”

class=”org.springframework.jmx.export.assembler.

MethodNameBasedMBeanInfoAssembler”

p:managedMethods=”getSpittlesPerPage,setSpittlesPerPage” />

<bean id=”mbeanExporter”

class=”org.springframework.jmx.export.MBeanExporter”>

<property name=”beans”>

<map>

<entry key=”spitter:name=HomeController”

value-ref=”homeController”/>

</map>

</property>

<property name=”server” ref=”mbeanServer” />

<property name=”assembler” ref=”assembler”/>

</bean>

3.基于annnocation方式

<context:mbean-export server=”mbeanServer” />

@ManagedResource(objectName=”spitter:name=HomeController”)

@ManagedOperation

@ManagedAttribute


Odds 

1. 使用spring中的配置单独出来,放到properties文件中

        <context:property-placeholder    location=”classpath:/db.properties” />

           <bean id=”dataSource”

    class=”org.springframework.jdbc.d

     p:driverClassName=”${jdbc.driverC

     p:url=”${jdbc.url}”

     p:username=”${jdbc.username}”

     p:password=”${jdbc.password}” />

   或者是annotation形式

      @Value(“${jdbc.url}”)

    String databaseUrl;

        这样只需要修改properties文件就可以

   Jasypt project可用于一些加密工作,可用于配置文件的加密

2.    JNDI      Java Naming and Directory Interface

      主要用于存储和取对象,比如data source, transaction manager

<jee:jndi-lookup id=”dataSource”

jndi-name=”/jdbc/SpitterDS”

resource-ref=”true”

cache=”false”     //禁用缓存,不然改变必须重新启动

lookup-on-startup=”false”   //  延迟加载

proxy-interface=”javax.sql.DataSource” />

可以通过设置default-ref,当从JNDI获取失败时,能够使用默认值

3.   可配置使用org.springframework.mail.javamail.JavaMailSenderImpl发邮件

      可以基于VelocityEngine实现邮件内容模板化

4.  两种background  jobs方案

             Scheduled jobs

Asynchronous methods

  在spring配置文件中<task:annotation-driven/> 然后通过@Scheduled和 @Async来实现

  @Async适合 这种“即发即忘”(fire-and-forget)情况,比如前台请求后后台直接自己处理就行了