applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd ">
</beans>
spring是开源的轻量级一站式框架
1、开源的
2、轻量级
3、一站式
spring在j2ee三层结构中,每一层都提供不同的解决技术
(1)web层:springmvc
(2)service层:spring的ioc
(3)dao层:spring的jdbcTemplate
spring的IOC和DI操作
ioc:控制反转-->底层技术{ xml配置文件,dom4j解析xml,工厂设计模式,反射} 1、把对象的创建交给spring进行管理
2、ioc操作两种方式:
(1)ioc的配置文件方式(掌握)
bean的实例化(三种方式)
①无参构造方法实例化(重点)
<bean id="user"class="com.yb.User"></bean>
bean标签常用属性:
id属性:根据id值得到配置对象,不能包含特殊字符。
class属性:创建所在类的全路径。
name属性:功能和id一样,但能包含特殊字符。
scope属性:(
singleton:默认值(缺省值),单例
prototype:多例
request:创建对象把对象放到request域里面
session:创建对象把对象放到session域里面
globalSession:创建对象把对象放到globalSession里面
)
②使用静态工厂创建(了解)
③使用实例工厂创建(了解)
(2)ioc注解方式注入(重点)
<!-- 扫描属性上面的注解(被下面的扫描方式取代) -->
<context:annotation-config></context:annotation-config>
<!-- 到包里面扫描:类、方法、属性上面的注释 -->
<!-- 若要扫描com.yb.entity、com.yb.dao ...里面的注解可写成com.yb-->
<context:component-scan base-package="com.yb"></context:component-scan>
在创建对象的类上面使用注解实现
①@Component 衍生出下面三个注解 用法相同
②@Controller :WEB层
③@Service :业务层
④@Repository 持久层
@Component(value="user")
public class User {}
创建对象是多实例还是单实例
@Component(value="user")
@Scope(value="prototype")
public class User {}
DI:属性注入
属性注入四种种方式: -->spring支持前三种注入方式
1、set方法注入(重点)
<bean id="user" class="com.yb.User">
<property name="name" value="youngboy"></property>
<!-- 对象注入 -->
<property name="men" ref="person"></property>
<!-- 复杂类型注入 -->
<!-- 数组 -->
<property name="arrs">
<list>
<value>小王</value>
<value>小马</value>
<value>小宋</value>
</list>
</property>
<!-- list -->
<property name="list">
<list>
<value>小奥</value>
<value>小金</value>
<value>小普</value>
</list>
</property>
<!-- map -->
<property name="map">
<map>
<entry key="aa" value="lucy"></entry>
<entry key="bb" value="mary"></entry>
<entry key="cc" value="tom"></entry>
</map>
</property>
<!-- properties -->
<property name="properties">
<props>
<prop key="driverclass">com.mysql.jdbc.Driver</prop>
<prop key="username">root</prop>
</props>
</property>
</bean>
2、构造方法注入(掌握)
<bean id="user" class="com.yb.User">
<!-- 简单类型注入 -->
<constructor-arg name="name" value="youngboy"></constructor-arg>
<!-- 对象注入 -->
<constructor-arg name="man" ref="person"></constructor-arg>
<!-- 复杂类型注入 -->
<constructor-arg name="arrs">
<list>
<value>小王</value>
<value>小马</value>
<value>小宋</value>
</list>
<!-- list map properties 同上set注入 -->
</constructor-arg>
</bean>
3、p名称空间注入(了解)
4、接口注入(了解)
属性注解注入(重点)
两个注解方式:
@Autowired @Resource(name="xxx")
<!-- 扫描属性上面的注解(被下面的扫描方式取代) -->
<context:annotation-config></context:annotation-config>
<!-- 到包里面扫描:类、方法、属性上面的注释 -->
<!-- 若要扫描com.yb.entity、com.yb.dao ...里面的注解可写成com.yb-->
<context:component-scan base-package="com.yb"></context:component-scan>
@Autowired
private Integer userId;
@Resource(name="username")
private String username;
Spring的aop操作(详情)
AOP操作术语
Joinpoint(连接点): 类里面可以被增强的方法,这些方法称为连接点
Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截的定义.
Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
Aspect(切面): 是切入点和通知(引介)的结合
Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.
Target(目标对象):代理的目标对象(要增强的类)
Weaving(织入):是把增强应用到目标的过程.
把advice 应用到 target的过程
Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类
使用表达式配置切入点
1 切入点:实际增强的方法
2 常用的表达式
execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)
(1)execution(* com.aop.Book.add(..))
(2)execution(* com.aop.Book.*(..))
(3)execution(* *.*(..))
(4) 匹配所有save开头的方法 execution(* save*(..))
<!-- 开启aop操作 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
@Aspect
public class LoginController {
@Before(value = "execution(* com.aop.Test.*(..))")
public void test() {
}
}
spring的事务管理第一步:配置事务管理器
<!-- 事务管理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource" />
<tx:advice id="txAdvice">
<tx:attributes>
<!-- 对update,delete,insert开头的方法进行事务管理,只要遇到异常就回滚 -->
<tx:method name="update*" propagation="REQUIED" rollback-for="java.lang.Throwable" />
<tx:method name="delete*" propagation="REQUIED" rollback-for="java.lang.Throwable" />
<tx:method name="insert*" propagation="REQUIED" rollback-for="java.lang.Throwable" />
<!-- 对查询数据库进行只读,提高数据库性能 -->
<tx:method name="select*" read-only="true" />
<tx:method name="count*" read-only="true" />
<!-- 对其他的方法进行默认处理 -->
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<!-- 事务 aop 配置 -->
<aop:config>
<aop:pointcut expression="execution(* com.yb.service.*.*(..))" id="serviceMethods" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods" />
</aop:config>
第二步:配置事务注解
<tx:annotation-driven transaction-manager="transactionManager"/>
第三步:在要使用事务的方法所在类上面添加注解
@Transactional
public class LoginService {}
spring-mvc配置
web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext-*.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--Restful支持 jsp的form表单直接使用method="POST"的方式提交,提交一个隐藏的input <input type="hidden" name="_method" value="put" /> -->
<filter>
<filter-name>HttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Restful支持 方式2 -->
<filter>
<filter-name>httpPutFormcontentFilter</filter-name>
<filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>httpPutFormContentFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<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:springMVC-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
springMVC-servlet.xml
<!-- 扫描controller -->
<context:component-scan base-package="**.controller"/>
<!-- 静态资源映射 -->
<mvc:resources location="/WEB-INF/js/" mapping="/js/**"></mvc:resources>
<mvc:resources location="/WEB-INF/css/" mapping="/css/**"></mvc:resources>
<mvc:resources location="/WEB-INF/img/" mapping="/img/**"></mvc:resources>
<mvc:resources location="/WEB-INF/font/" mapping="/font/**"></mvc:resources>
<!-- 自动配置适配器和映射器 -->
<mvc:annotation-driven ></mvc:annotation-driven>
<!-- jsp视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" />
</beans>