環境:ダボのSSMフレームワーク
1.AOP部コード(ウェブ層)
@Aspect
@Component
パブリック クラスLogAopController {
@Autowired
プライベート HttpServletRequestのリクエスト; // 必要web.xmlの設定
@Reference // さまざまなアイテムと@Autowired @Reference場合ノートが使用できない
プライベート-サービスISysLogService;
プライベート A日visitTime; // 5。開始時刻
プライベートクラスclazzは、// 6つのアクセスクラス。
プライベート法、法; // 7へのアクセス方法
/ *
?オペレータ1の入手方法
IPへのアクセスを取得する方法* 2
* 3どのようにアクセスURL。
*行なわを取得する方法4。長い
* /
// 実行の一種である事前通知、主要取得開始時間、メソッドの実行
@Before( "実行(com.qingcheng.controller.goods.SpuController *。*(..))")// *パッケージ内のすべてのクラスです。*クラスのすべてのメソッドはあります
公共 無効 doBefore(ジョインポイントJP)スローないNoSuchMethodException {
visitTime = 新しい新しい A日付を(); // 現在の時刻が開始され
clazz = jp.getTarget()のgetClass();. // 取得したクラス
のString methodNameの= jp.getSignature()のgetName();. // のみこの方法は、名前取得できる
オブジェクト[]引数= jp.getArgs(); // アクセス方式パラメータが取得
// 特定のメソッドを取得するオブジェクトない
IFを(引数== NULL || args.length == 0 ){
// ないパラメータ
= clazz.getMethodメソッド(methodNameの); // メソッドの名前、パラメータなしの方法のみを取得
} 他{
// 有するパラメータ
クラス[] = classArgs 新しい新しいクラス【args.length];
のための(INT I = 0。 I <args.length; I ++ ){
classArgs [I] =引数[I] .getClass(); // 各パラメータの方法は、配列に格納されている
}
メソッド = clazz.getMethod(methodNameの、classArgs);
}
}
// ポスト予告
@After( "実行(com.qingcheng.controller.goods.SpuController *。*(..))" )
公衆 空doAfter(ジョインポイントのJP){
// 4の実行の期間取得する方法?
文字列の時間= String.valueOf(新新 A日付()getTime()を- 。visitTime.getTime());
// 3のURLへのアクセス取得するためにどのように
文字列のURLを= "" ;
IF(clazz =!ヌル &&方法=!ヌル && clazz = LogAopController!。クラス){
// 取得@RequestMapping URL( "/ findAll.do")
// サブクラスのオブジェクト名=(サブクラス)親、強制サブクラス所与の親クラス・オブジェクトを変換するオブジェクト必要キャストサブクラスオブジェクト(少し知識!!!!)
@RequestMapping classAnnotation =(@RequestMapping)clazz.getAnnotation(@RequestMapping。クラス);
IF(!classAnnotation = NULL ){
// 1パスに基づいて取得した
文字列[] = classValue classAnnotation.value();
// パス2.得る方法
@RequestMapping methodAnnotation = method.getAnnotation(@RequestMapping。クラス);
IF( !methodAnnotation = NULL ){
文字列[] methodValue = methodAnnotation.value(); // アプローチのパス取得
// クラスパスとパスの方法
URL classValue = [0] + methodValue [0 ];
}
}
}
//どのようにアクセス権を取得するためにどのように2 IPアドレスを取得するに
@ 1 web.xmlの構成に依存注入のHttpServletRequest 2.ゲットリクエストオブジェクト
の文字列request.getRemoteAddr IP =(); // / IPを取得
// カプセル化情報
のSyslogのsyslogを= 新しい新しいのSyslog() ;
UUID UUID = UUID.randomUUID();
syslog.setId(uuid.toString()); // 1。
syslog.setExecutionTime(時間); // 2
syslog.setIp(IP); // 3。
syslog.setMethod(「[タイプ"+ clazz.getName()+" [ 方法] "+ method.getName()); // 4。
syslog.setUrl(URL); // 5。
syslog.setUsername(" TEST「)。// 6
syslog.setVisitTime(visitTime)。// 7
のSystem.out.println(シスログ)。
service.saveLog(syslogの);
}
}
2. [設定MVC xmlファイル
<コンテキスト:コンポーネント・スキャンベースパッケージ=「スキャンパッケージパス」/>
<量Aop:AspectJの-自動プロキシプロキシ・ターゲット・クラス= "真" /> <! - AOPサポートのアノテーションのサポート、AOPの基礎となるエージェント技術 - >
3.web層クエリーログコード
@RestController
@RequestMapping("/spuLog")
public class LogSpuController {
@Reference
private ISysLogService spuService;
@GetMapping("findAll")
public List<Syslog> findAll(){
return spuService.findAll();
}
}
4.pojo
@Table(name = "tb_syslog")
public class Syslog implements Serializable {
@Id
private String id;
private Date visitTime;
private String visitTimestr; //注意 visitTimestr 设计数据库字段为visit_timestr Mapper才会识别
private String username;
private String ip;
private String url;
private String executionTime;
private String method;
}
5.service接口
public interface ISysLogService {
public void saveLog(Syslog syslog); //保存日志
List<Syslog> findAll();//查询所有日志
}
6.service层下的dao (使用的通用mapper)
public interface ISysLogMapper extends Mapper<Syslog> {
}
7.service层下的接口实现
@Service
public class ISysLogServiceImpl implements ISysLogService {
@Autowired
private ISysLogMapper iSysLogMapper;
public void saveLog(Syslog syslog) {//保存日志
iSysLogMapper.insert(syslog);//当mysql数据库设置默认值时,如果使用insert插入会把字段为空的值也插入到数据库,所以数据库设置的默认值也没用
}
public List<Syslog> findAll() {
return iSysLogMapper.selectAll();
}
}
切面配置好后会显示m->
8.测试