異常通知:
public class BookExceptionAdvice implements ThrowsAdvice { public void afterThrowing(Method method, Object[] args, Object target, Exception ex) { String message = method.getName() + "方法,出現了異常,異常的信息是:" + ex.getMessage(); System.out.println(message); } }
前置通知:
import org.springframework.aop.MethodBeforeAdvice; //一定要加載AOP的庫纔可以使用 MethodBeforeAdvice --> Advice(org.aopalliance不在spring包中) --> Interceptor public class LogAdvice implements MethodBeforeAdvice { private static DateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh時mm分ss秒"); // Object target: target of the method invocation. May be null. public void before(Method m, Object[] args, Object target) throws Throwable { System.out.println("/n[系統日誌][" + sdf.format(new Date()) + "] 調用方法:" + m.getName() + "(參數是: " + Arrays.toString(args) + ")"); } }
後置通知:
public class RakeOffAdvice implements AfterReturningAdvice { @Override public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable { //只有bug方法才返利 if (method.getName().equals("buy")) { System.out.println("[銷售返利][" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "] " + args[0] + ": 返利3元"); } } }
環繞通知:
package bookstore.log; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; /* * 環繞增強 */ public class GreetingInterceptor implements MethodInterceptor { /* * MethodInvocation不但封裝目標方法及其入參數組,還封裝了目標方法所在的實例對象 * 通過getArguments()可以獲取目標方法的入參數組,通過proceed()反射調用目標實例相應的方法 */ @Override public Object invoke(MethodInvocation invocation) throws Throwable { Object[] args = invocation.getArguments(); //目標方法入參 String user = (String) args[0]; System.out.println("你好!" + user); //運行方法前調用 Object obj = invocation.proceed(); //調用方法 System.out.println("歡迎你的光臨!"); //目標方法之後運行 return obj; } }
Spring的配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" 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-2.0.xsd"> <!-- 書籍的業務邏輯實現類 --> <bean id="bookBizTarget" class="bookstore.biz.BookBizImpl" /> <!-- 日誌記錄類(前置) --> <bean id="logAdvice" class="bookstore.log.LogAdvice" /> <!-- 日誌記錄類(後置) --> <bean id="rakeOffAdvice" class="bookstore.log.RakeOffAdvice" /> <!-- 環繞通知 --> <bean id="greetingAround" class="bookstore.log.GreetingInterceptor"/> <!-- 代理工廠類進行織入 --> <bean id="bookBiz" class="org.springframework.aop.framework.ProxyFactoryBean"> <!-- 相應的業務接口 --> <property name="proxyInterfaces"> <value>bookstore.biz.BookBiz</value> </property> <!-- 設置要織入的類名,參數是一個字符串的數組 --> <property name="interceptorNames"> <list> <value>greetingAround</value> </list> </property> <!-- 代理實現的類 --> <property name="target" ref="bookBizTarget" /> </bean> </beans>
測試代碼:
public class AOPTest { /** * @param args */ public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("aop.xml"); // 將代理工廠做爲業務接口的子對象 BookBiz bookBiz = (BookBiz) context.getBean("bookBiz"); // 直接調用接口方法 // bookBiz.buy("高志水", "CMMi實務手冊", 50); bookBiz.comment("王箏", "《盜墓筆記》一點都不恐怖,很好看!"); } }
security的簡單原理: 使用衆多的攔截器對url攔截,以此來管理權限。但是這麼多攔截器,不可能對其一一來講,主要講裏面核心流程的兩個。 首先,權限管理離不開登陸驗證的,所以登陸驗證攔截器AuthenticationProcessing
1、 2、 3、 4、 5、 6、 7、運行 HelloWorld 啓動後內置的Tomcat服務器也同時啓動起來了,然後在瀏覽器中輸入 localhost:8080/hello
1、單體應用的缺點 1)部署效率低下 2)協作開發成本高 3)系統高可用性能差 4)線上發佈變慢 2、微服務的簡單介紹 2.1)將一個單一應用程序,按照業務拆分呢爲一組小型服務. 2.2)每個服務只做一件事,每個服務運行在自己的進程中 2.
1、引入依賴 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>
一、微服務和微服務架構 1.1)什麼是微服務 把一個單一的應用程序劃分爲一組小 的服務,每個小的服務都會運行在自己的進程中,服務之間通過輕量級的通信機制(http的rest api)進行通信,那麼 一個個的小服務就是微服務。
一:WebSocket原理 1、要談WebSocket就不得不提起HTTP連接 WebSocket是HTML5出的東西(協議,就是大家一起約定好的東西),也就是說HTTP協議沒有變化,或者說沒關係,但HTTP是不支持持久連接的(
線程池原理 Java創建一個線程很方便,只需new Thread()就可以, 但是當有多個任務需要進行進行處理時,頻繁的進行創建和啓用線程同樣需要系統開銷,也不利於管理,於是同mysql的連接池一樣,自然有對線程的管理池即線程池。
thymeleaf介紹 thymeleaf 是新一代的模板引擎,在spring4.0中推薦使用thymeleaf來做前端模版引擎。簡單說是一個跟 Velocity、FreeMarker 類似的模板引擎,它可以完全替代 JSP 。相較與其他的
使用 spring boot 有什麼好處 其實就是簡單、快速、方便!平時如果我們需要搭建一個 spring web 項目的時候需要怎麼做呢? 配置 web.xml,加載 spring 和 spring mvc 配置數據庫連接、配置 sp
問題一、 Error:(28, 0) No such property: values for class: org.gradle.api.internal.tasks.DefaultTaskDependency Possible solu
@[toc] Spring cloud 使用 Ribbon 來實現客戶端負載均衡 前言 在Spring cloud 中當統一類型多個服務開始註冊到服務註冊中心中,次數服務即是集羣 消費端(客戶端)消費的時候需要進行選擇調用服務。 服務註冊
Spring cloud eureka 高可用集羣配置 前言 eureka 註冊中心單機模式,容災性低,註冊服務多,單個節點性能低,容易發生故障,甚至崩潰等。 生產中我採用集羣模式,也就是eureka的高可用。 如何搭建高可用集羣配置 僅僅
Spring cloud中使用 Hystrix 前言 Hystrix 在Spring Cloud中使用了Netflix開發的Hystrix來實現熔斷器。可以稍微通過幾個簡單的代碼示例,學習Hystrix 導入依賴 <!-- 整合hy
一個微服務在線上可能多版本共存,例如: 服務提供者有兩個版本:v1、v2 服務消費者也有兩個版本:v1、v2 v1/v2是不兼容的。 1、服務消費者v1只能調用服務提供者v1;消費者v2只能調用提供者v2。 2、優先調用同集羣下的實例。
文章目錄基於註解配置的聲明式事務控制1. 配置事務管理器2. 註解事務支持``3. `@Transaction`註解標註事務示例 基於註解配置的聲明式事務控制 要使用註解,就要導入xmlns:context的名稱空間,以及配置包掃