Spring之mvc應用(包含aop)
阿新 • • 發佈:2020-08-05
一、使用依賴
<!--1。mysql 5.1.38--> <!--2. mybatis 3.4.6--> <!--3。spring整合mb:spring-context 5.2.6--> <!-- spring-jdbc 5.2.6--> <!-- mybatis-spring 2.0.3--> <!--4. mvc使用的 spring-web 5.2.6--> <!-- spring-mvc 5.2.6--> <!-- 5.資料傳輸格式jackson-databind 2.11.0--> <!-- ackson-core 2.11.0--> <!-- 6. servlet 3.1.0--> <!-- 7. aop需要的:aop-aspect-runtime 1.9.4 --> <!-- aop-aspect-weaver 1.9.4 --> <!-- 8.日誌需要的:log4j 1.2.17 -->二、目錄
三、spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"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/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <context:component-scan base-package="control"/> <context:annotation-config/> <mvc:annotation-driven/>
<bean class="com.fasterxml.jackson.databind.ObjectMapper"/> <aop:aspectj-autoproxy/> <!--依賴倒置 DI--> <!--切面程式設計--> <!--攔截器--> </beans>
spring-mybatis.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" 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 "> <context:component-scan base-package="model"/> <context:annotation-config/> <context:property-placeholder location="classpath:datasource.properties"/> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${mysql.driver}"/> <property name="url" value="${mysql.url}"/> <property name="username" value="${mysql.username}"/> <property name="password" value="${mysql.password}"/> </bean> <!--宣告式(註解)事務--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="typeAliasesPackage" value="entity"/> <property name="mapperLocations" value="classpath:mapping/*Mapper.xml"/> </bean> <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> <property name="basePackage" value="model.mapper"/> </bean> </beans>
四、Service中:
@Service public class StudentService{ @Autowired private StudentMapper sm;
control中:
package control; import entity.StudentInfo; import model.service.StudentService; import org.aspectj.lang.annotation.Aspect; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import pageutil.Result; import java.sql.SQLException; @CrossOrigin // 跨域訪問,結合RestController一起用,Rest代表ajax,前後端分離 @RestController // 如果只是jsp頁面訪問,使用Controller就行了 public class StudentControl{ @Autowired private StudentService ss; /** * <!--宣告式(註解)事務--> * 事務: 應用場景:多條修改級語句共同完成一個業務 * 事務特性:原子性,隔離性,一致性 * 隔離級別 isolation = Isolation.READ_COMMITTED * 超時:timeout = int (second) * 開始事務,提交事務,回滾事務 * spring框架:propagation = Propagation.REQUIRED (預設值:有事務則用,無則加事務) * 回滾機制:rollbackFor = 異常型別:SqlException.class * @param stu * @return */ @PostMapping("/as.do")
// 如果超過10秒就回滾,如果出現sql異常就回滾 @Transactional(timeout = 10,rollbackFor = SQLException.class) public Result addStu(StudentInfo stu) { return ss.addStu(stu); } @GetMapping("/rs.do") public Result removeStu(int sid) { return ss.removeStu(sid); } @GetMapping("/msf.do") public Result modifyStuFind(int sid) { return ss.modifyStuFind(sid); } @PostMapping("/ms.do") public Result modifyStu(StudentInfo stu) { return ss.modifyStu(stu); } @GetMapping("/fsp.do")
// 查詢操作,只讀不改 @Transactional(readOnly = true) public Result findStu(int pageNo) { final int pageSize = 5; return ss.findStu(pageNo, pageSize); } }
五、如何新增AOP?
1) pom中需要有
aspect-runtime:aspectjrt &&
aspect-weaver:aspectjweaver
2)mvc中配置
<bean class="com.fasterxml.jackson.databind.ObjectMapper"/>
<aop:aspectj-autoproxy/>
3)controller層中新增Handler
package control; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.log4j.Logger; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import pageutil.Result; @Component @Aspect public class ControlLogAspectHandler { private static Logger logger = Logger.getLogger(ControlLogAspectHandler.class); @Autowired private ObjectMapper mapper; // 在哪裡做: *表示返回型別;control包下的以Control結尾的類的*方法名的無參或多個引數的方法 @Pointcut(value = "execution(* control.*Control.*(..))") public void pointcut(){} private StringBuilder parse(JoinPoint jp) throws JsonProcessingException { StringBuilder builder = new StringBuilder(); String t = jp.getTarget().getClass().getName(); String m = jp.getSignature().getName(); Object[] r = jp.getArgs(); builder.append(t); builder.append("."); builder.append(m); builder.append("("); builder.append(mapper.writeValueAsString(r)); builder.append(")"); return builder; } // 做什麼 @AfterReturning(value = "pointcut()",returning = "rtn") public void afterReturning(JoinPoint jp, Result rtn) throws JsonProcessingException { StringBuilder builder = parse(jp); builder.append(" RETURN "); builder.append(mapper.writeValueAsString(rtn)); logger.info(builder.toString()); } @AfterThrowing(value = "pointcut()",throwing = "ex") public void afterThrowing(JoinPoint jp,Exception ex){ try { StringBuilder builder = parse(jp); builder.append(" THROW "); builder.append(ex.toString()); logger.error(builder.toString()); } catch (JsonProcessingException e) { logger.error(e.getMessage()); } } }