接下来是Spring的总结。
1. 简介
Spring官网首页上的一句话概括了Spring的作用:Spring帮助开发团队建立简单的,轻便的,快速和灵活的基于JVM的系统和应用。也可以说,是为了解决企业应用程序开发复杂性而创建的。
框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。核心是控制反转(IoC)和面向切面(AOP)。
2. 框架结构
下图是Spring官网上面的Spring框架的结构图,详细的展示了Spring各个模块。
下边介绍一下各个模块内容:
核心容器:主要包括spring-core,spring-beans,spring-context,spring-context-support,spring-expression。
spring-core,spring-beans提供了框架最基础的部分,包括IOC和依赖注入。
spring-context模块是建立在core模块和beans模块之上的,提供了一种类似于JNDI注册机制的,以框架方式访问对象的方法,还支持Java EE的特点,如EJB,JMX,和basic remoting。
spring-context-support模块提供了将第三方类库加入Spring容器中的支持,如缓存,邮件,模板引擎,调度等。
spring-expression模块提供了一种可以实时查询和操作对象图的强大的表达式语言。它是JSP2.1中定义的unified EL的一个拓展。
spring-aop模块提供了允许你自己定义的面向切面的编程方式。
spring-aspects模块提供了与AspectJ的整合。
spring-instrumentation模块提供了在某些特定应用程序容器中的类装载支持和类加载器的实现。
spring-message模块,Spring4之后添加,包括了spring整合项目中的Message,MessageChannel,MessageHandler的关键抽象,以及其他的作为消息应用程序的基础的东西。
数据访问/集成:包括JDBC, ORM, OXM, JMS, 和Transaction模块。
spring-jdbc:提供了JDBC抽象层,不需要复杂的编码了。
spring-tx:提供了实现了特定接口的类和所有的POJO对象的事务管理。
spring-orm:提供了与比较流行的O/R Mapping APIs的整合,比如Hibernate。
spring-xrm:提供了与比较流行的Xml/R Mapping APIs的整合。
spring-jms:提供了消息的生产和消费的特性,在Spring4.1之后与spring-message一块出来。
Web:包括spring-web,spring-webmvc,spring-websocket,spring-webmvc-portlet。
spring-web:提供了基本的面向web的综合特性,如文件上传等。
spring-webmvs:包括了Spring的 模型-视图-控制器(MVC)模型和web应用程序的REST web service实现。
3. IOC:
如果使用maven,在pom中添加:
1 <!-- Spring --> 2 <dependency> 3 <groupId>org.springframework</groupId> 4 <artifactId>spring-web</artifactId> 5 <version>3.0.4.RELEASE</version> 6 <exclusions> 7 <exclusion> 8 <groupId>commons-logging</groupId> 9 <artifactId>commons-logging</artifactId> 10 </exclusion> 11 </exclusions> 12 </dependency>
在web.xml中添加如下代码:
1 <!-- Spring配置 --> 2 <context-param> 3 <param-name> contextConfigLocation</param-name> 4 <param-value> classpath:/applicationContext.xml </param-value> 5 </context-param> 6 <listener> 7 <listener-class> org.springframework.web.context.ContextLoaderListener 8 </listener-class> 9 </listener> 10 <listener> 11 <!-- 负责处理由Struts或Quartz等框架中JavaBeans Introspector的使用而引起的缓冲泄露。 --> 12 <listener-class> 13 org.springframework.web.util.IntrospectorCleanupListener 14 </listener-class> 15 </listener>
添加applicationContext.xml文件,内容为:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 3 "http://www.springframework.org/dtd/spring-beans.dtd" > 4 <beans> 5 <description>Spring公共配置 </description> 6 7 <bean name="now" class="java.util.Date"></bean> 8 <bean name="person" class="com.zhangyx.spring.test.beans.Person" depends-on="now" autowire="constructor"> 9 <!-- 使用构造方法注入 --> 10 <constructor-arg> 11 <value>张三</value> 12 </constructor-arg> 13 <!-- 使用set方法注入 --> 14 <property name="age"> 15 <value>12</value> 16 </property> 17 <!-- 引用其他的bean作为值 --> 18 <property name="now"> 19 <ref bean="now" /> 20 <!-- 在引用的是使用id唯一标示的,可以使用local --> 21 <!-- <ref local="now" /> --> 22 <!-- 设为null的两种方法 --> 23 <!-- < null/> <value>null</value> --> 24 </property> 25 <!-- 集合的注入 --> 26 <property name="courses"> 27 <list> 28 <value>语文</value> 29 <value>数学</value> 30 <value>英语</value> 31 </list> 32 </property> 33 </bean> 34 </beans>
Person类内容:
1 public class Person implements InitializingBean{ 2 private String name; 3 private Integer age; 4 private Date now; 5 private List<String> courses; 6 7 public Person(String name) { 8 this.name = name; 9 } 10 11 @Override 12 public void afterPropertiesSet() throws Exception { 13 if(this.age < 15) { 14 this.age = 15; 15 } 16 } 17 18 ...getter,setter方法... 19 20 @Override 21 public String toString() { 22 return "{name:" + this.name + ", age:" + this.age + ", now:" + this.now + " courses:" + this.courses + "}"; 23 } 24 }
主类:
1 public class TestSpring { 2 public static void main(String[] args) { 3 ApplicationContext actx = new FileSystemXmlApplicationContext("src/main/resources/applicationContext.xml" ); 4 Person person = (Person)actx.getBean("person" ); 5 System. out.println(person); 6 } 7 }
输出结果为:{name:张三, age:15, now:Mon Mar 30 21:43:16 CST 2015 courses:[语文, 数学, 英语]}
上面配置中,名称是用constructor方法设置的,age是用setAge方法设定的,courses是直接将一个list通过setter方法设定,now是引用了一个其它的bean。
上面就是Spring中IOC的基本应用了。
4. AOP
AOP:面向切面编程,主要是想将一些公共的代码逻辑从业务逻辑中抽离出来,如日志记录,事务处理,性能管理,异常处理等,通过这种行为分离,使得改变这些行为的时候不影响业务逻辑的代码。
下面是AOP的一个简单例子:
1 //要代理的接口 2 public interface PersonMngInterface { 3 public void savePerson(String name ); 4 } 5 6 //要代理的目标类 7 public class PersonMng implements PersonMngInterface{ 8 @Override 9 public void savePerson(String name) { 10 System. out.println("save person:" + name); 11 } 12 } 13 14 //Spring的通知(Advice) 15 import org.aopalliance.intercept.MethodInterceptor; 16 import org.aopalliance.intercept.MethodInvocation; 17 18 19 public class LogAdvice implements MethodInterceptor{ 20 @Override 21 public Object invoke(MethodInvocation arg0) throws Throwable { 22 System. out.println("Advice Before!" ); 23 Object result = arg0.proceed(); 24 System. out.println("Advice After!" ); 25 return result; 26 } 27 }
配置文件如下:
1 <!-- Spring配置 --> 2 <bean id= "log" class ="com.zhangyx.aop.LogAdvice"></ bean> 3 <bean id= "personMng" class ="com.zhangyx.aop.PersonMng"></ bean> 4 <bean id= "logAdvice" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor" > 5 <property name="advice" > 6 <ref local="log" /> 7 </property> 8 <property name="patterns" > 9 <!-- "."表示任意一个字符,"[]"表示只有[]内的字符才能匹配,"*"表示匹配次数为任意次,"?"表示匹配次数为0-1次,"\"是转义符 --> 10 <value> .*save.*</value > 11 </property> 12 </bean> 13 <bean id= "logProxy" class="org.springframework.aop.framework.ProxyFactoryBean" > 14 <!-- 配置之后,可以把获取的bean对象直接强制转换成本身的类,同时proxyInterfaces就无用了。 --> 15 <property name="proxyTargetClass" > 16 <value> true</value > 17 </property> 18 <property name="proxyInterfaces" > 19 <value> com.zhangyx.aop.PersonMngInterface</value > 20 </property> 21 <property name="target" > 22 <ref local="personMng" /> 23 </property> 24 <property name="interceptorNames" > 25 <list> 26 <value> logAdvice</value > 27 </list> 28 </property> 29 </bean>
原文:http://www.cnblogs.com/dearway/p/4378638.html