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)情况,比如前台请求后后台直接自己处理就行了
转载于:https://blog.51cto.com/lonely7345/1428102