@讲下SpringMvc的执行流程@
系统启动的时候根据配置文件创建spring的容器, 首先是发送http请求到核心控制器disPatherServlet,spring容器通过映射器去寻找业务控制器,
使用适配器找到相应的业务类,在进业务类时进行数据封装,在封装前可能会涉及到类型转换,执行完业务类后使用ModelAndView进行视图转发,数据放在model中,用map传递数据进行页面显示
spring是开源的轻量级一站式框架
1、开源的
2、轻量级
3、一站式
[plain]
view plain
copy
- 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的实例化(三种方式)
①无参构造方法实例化(重点)
[html]
view plain
copy
- <bean id=”user”class=”com.yb.User”></bean>
[html]
view plain
copy
- bean标签常用属性:
- id属性:根据id值得到配置对象,不能包含特殊字符。
- class属性:创建所在类的全路径。
- name属性:功能和id一样,但能包含特殊字符。
- scope属性:(
- singleton:默认值(缺省值),单例
- prototype:多例
- request:创建对象把对象放到request域里面
- session:创建对象把对象放到session域里面
- globalSession:创建对象把对象放到globalSession里面
- )
②使用静态工厂创建(了解)
③使用实例工厂创建(了解)
(2)ioc注解方式注入(重点)
[html]
view plain
copy
- <!– 扫描属性上面的注解(被下面的扫描方式取代) –>
- <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 持久层
[java]
view plain
copy
- @Component(value=“user”)
- public class User {}
创建对象是多实例还是单实例
[java]
view plain
copy
- @Component(value=“user”)
- @Scope(value=“prototype”)
- public class User {}
DI:属性注入
属性注入四种种方式: –>spring支持前三种注入方式
1、set方法注入(重点)
[html]
view plain
copy
- <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、构造方法注入(掌握)
[html]
view plain
copy
- <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”)
[html]
view plain
copy
- <span class=“space” style=“text-indent:2em;line-height:inherit;”><!– 扫描属性上面的注解(被下面的扫描方式取代) –>
- <context:annotation-config></context:annotation-config>
- <!– 到包里面扫描:类、方法、属性上面的注释 –>
- <!– 若要扫描com.yb.entity、com.yb.dao …里面的注解可写成com.yb–>
- <context:component-scan base-package=“com.yb”></context:component-scan></span>
[html]
view plain
copy
- @Autowired
- private Integer userId;
- @Resource(name=“username”)
- private String username;
Spring的aop操作(详情)
AOP操作术语
[html]
view plain
copy
- Joinpoint(连接点): 类里面可以被增强的方法,这些方法称为连接点
- Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截的定义.
- Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
- Aspect(切面): 是切入点和通知(引介)的结合
- Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.
- Target(目标对象):代理的目标对象(要增强的类)
- Weaving(织入):是把增强应用到目标的过程.
- 把advice 应用到 target的过程
- Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类
使用表达式配置切入点
[html]
view plain
copy
- 1 切入点:实际增强的方法
- 2 常用的表达式
- execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)
- (1)execution(* com.aop.Book.add(..))
- (2)execution(* com.aop.Book.*(..))
- (3)execution(* *.*(..))
- (4) 匹配所有save开头的方法 execution(* save*(..))
[html]
view plain
copy
- <!– 开启aop操作 –>
- <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
[java]
view plain
copy
- @Aspect
- public class LoginController {
- @Before(value = “execution(* com.aop.Test.*(..))”)
- public void test() {
- }
- }
spring的事务管理
第一步:配置事务管理器
[html]
view plain
copy
- <!– 事务管理 –>
- <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>
第二步:配置事务注解
[html]
view plain
copy
- <tx:annotation-driven transaction-manager=“transactionManager”/>
第三步:在要使用事务的方法所在类上面添加注解
[java]
view plain
copy
- @Transactional
- public class LoginService {}
系统启动的时候根据配置文件创建spring的容器, 首先是发送http请求到核心控制器disPatherServlet,spring容器通过映射器去寻找业务控制器,
使用适配器找到相应的业务类,在进业务类时进行数据封装,在封装前可能会涉及到类型转换,执行完业务类后使用ModelAndView进行视图转发,数据放在model中,用map传递数据进行页面显示