一、Spring的认识
Spring是一个开发框架,而框架最主要的目的是为我们开发提供便利。将与业务逻辑无关的、较为通用的东西提取出来。而我们只需要将视线放到业务逻辑的处理上即可。
Spring有几个基础概念:控制反转(IOC)、面向切面编程(AOP)等
控制反转:将类间的依赖关系交给IOC容器管理,简单来说就是把平时new Service()这种代码交给Spring来做,我们只要用它new出来的对象即可。
依赖注入:Spring将new出来的对象注入到被注入对象中。
面向切面编程:对面向对象编程(OOP)的补充。常用的拦截器本质上就是AOP。
下面是Spring框架图,大概预览下。以后用到慢慢理解。
二、Spring配置过程
Spring的核心是DispatcherServlet,它本质上是一个Servlet。根据url-pattern拦截到请求后,转到这个Servlet中进行处理。
由此知道过滤器、拦截器、controller(action)的执行过程:
filter->interceptor->action->interceptor->filter
如果配置了切面方法的话,切面方法在哪一步执行呢?待测试。
(1)web.xml
Spring本质是Servlet,所以第一步是在Web.xml中配置DispatcherServlet.
ps.这里简要说下“父子容器”的概念。Servlet可以定义多个,每个定义的DispatcherServlet都有一个自己的上下文(applicationContext),有时可能需要相互交互、或者同时调用了同一个bean。此时可以使用监听器读取一个配置文件作为父容器。不过一般情况下只要使用一个servlet就可以了。
<!-- 监听器读取的配置文件位置 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/daoContext.xml /WEB-INF/applicationContext.xml</param-value> </context-param> <!-- 监听器的启动早于servlet,所以可以在子容器中读取这里(父容器)的bean,但反之则不然 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
<!-- Spring最根本的入口在这个servlet --> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 定义配置文件的位置,可以匹配多个,正则 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext*.xml</param-value> </init-param> <!-- 自启动,启动tomcat时自动加载配置文件,会自动加载配置中的bean,除非将bean设置为懒加载 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <!--
映射规则,以.do结尾的请求都会映射到这个servlet,由spring处理
ps.配置格式有很多种,这种最方便,不会拦截掉静态文件,不过每次访问的时候需要在url之后加上.do。其他的之后再说。
--> <url-pattern>*.do</url-pattern> </servlet-mapping>
(2.1)applicationContext.xml(使用配置)
<!-- 大致形式: <beans> <bean/> </beans> --> <!-- 读取配置文件方式: <context:property-placeholder location="classpath:conf.properties" ignore-unresolvable="true" /> 使用方式: ${config.key} --> <beans> <!-- id是唯一的,不可重复; name作为bean的别名,可以重复,且可以设置多个:name="name1,name2,name3" 用逗号隔开,但强烈不建议使用name; id或name都可以用getBean获取; 如果都没指定,则可以用全类名获取 --> <bean id="id" name="name" class="com.thunder.custom.CustomClass"/> </beans>
(2.2)applicationContext.xml(使用注解)
<!-- 指定Spring IOC 容器扫描的包 --> <!-- 可以通过resource-pattern指定扫描的资源 --> <!-- <context:component-scan base-package="com.coslay.beans.annotation" resource-pattern="reporsitory/*.class"> --> <!-- context:exclude-filter 子节点指定排除哪些指定表达式的组件 context:include-filter 子节点指定包含哪些表达式的组件,该子节点需要use-default-filters="false"配合使用,默认为true
(如果use-default-filters="ture",则使用系统默认扫描所有带有@Component@Controller@Service@Repository的组件) -->
<!-- 接下来都实用注解 -->
<context:component-scan base-package="com.coslay.beans.annotation"> </context:component-scan>
具体的配置节点:http://book.51cto.com/art/201004/193743.htm
(3)关于注入
由spring容器将对象注入到bean里。也分为xml装配和annotation标注两种。
xml配置就是在<bean>节点里配置<property name="valueName" value="value"/>
annotaion则使用@Autowired或者@Resource
@Autowired默认按类型注入,@Resource则是有name属性就按名字(id或name)注入,否则按类型注入