當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
面向方面编程(Spring AOP)
生活随笔
收集整理的這篇文章主要介紹了
面向方面编程(Spring AOP)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
為什么80%的碼農都做不了架構師?>>> ??
AOP 的重要概念
1 ?切面?
? ?切面編程(事務, 日志, 安全) 編程實現 在實際應用中通常是存放切面的普通java 類 需要通過配置<bean>標識指定
2 ?通知?
? 通知是切面的具體表現,億ro目標作為參照點,根據位置的不同,又分為 ?(前置通知, 后置通知 , 異常通知, 環繞通知)調用時 需要指定具體位置。
3 切入點
切入點用于定義通知到什么連接點去。
?4 ?目標對象?
目標對象指定的是織入切面的對象
5 代理對象
通過目標對象應用之后,被動態創建的對象, 代理對象的功能相當與目標對象中核心業務邏輯功能加上方面代碼實現的功能
6 織入
織入是將切面應用到目標對象 ,從而創建一個新的代理對象的過程。
代碼實現
基于代理類ProxyFactoryBean實現AOP
?
package com.sun.dao;
?
public interface UserDao {
//添加用戶
//刪除用戶
public void delUser(int id);
public void addUser(String username, String password);
}
package com.sun.dao;public class UserDaoImpl implements UserDao {
public void addUser(String username, String password) { // TODO Auto-generated method stub System.out.println("添加用戶"+username+"成功"); }
public void delUser(int id) { // TODO Auto-generated method stub System.out.println("刪除"+id+"成功"); }
}
package com.sun.biz;
public interface UserBiz { public void addUser(String username,String password); //刪除用戶 public void delUser(int id); } package com.sun.biz;
import com.sun.dao.UserDao;
public class UserBizImpl implements UserBiz { UserDao userdao;
public UserDao getUserdao() { return userdao; }
public void setUserdao(UserDao userdao) { this.userdao = userdao; }
public void addUser(String username, String password) { // TODO Auto-generated method stub userdao.addUser(username, password); }
public void delUser(int id) { // TODO Auto-generated method stub userdao.delUser(id); }
}
package com.sun.aop;
import java.lang.reflect.Method;
import org.apache.log4j.Logger; import org.springframework.aop.MethodBeforeAdvice;
public class LoggerAdvice implements MethodBeforeAdvice {
private Logger logger = Logger.getLogger(LoggerAdvice.class); public void before(Method method, Object[] args, Object target) throws Throwable { // TODO Auto-generated method stub String targetClassName = target.getClass().getName(); //h獲取被調用的方法名 String targetMethodName=method.getName(); //日志格式字符串 String loginInfoText = "前置通知"+targetClassName+"類的"+targetMethodName+"方法開始執行"; logger.info(loginInfoText); } 創建log4j.properties log4j.rootLogger=info,stdout,info,debug,error log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c - %m%n log4j.logger.info=info log4j.appender.info=org.apache.log4j.DailyRollingFileAppender log4j.appender.info.layout=org.apache.log4j.PatternLayout log4j.appender.info.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c - %m%n log4j.appender.info.datePattern='.'yyyy-MM-dd log4j.appender.info.Threshold = INFO? log4j.appender.info.append=true log4j.appender.info.File=${webApp.root}/WEB-INF/logs/info.log log4j.logger.debug=debug log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender log4j.appender.debug.layout=org.apache.log4j.PatternLayout log4j.appender.debug.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c - %m%n log4j.appender.debug.datePattern='.'yyyy-MM-dd log4j.appender.debug.Threshold = DEBUG? log4j.appender.debug.append=true log4j.appender.debug.File=${webApp.root}/WEB-INF/logs/debug.log
log4j.logger.error=error log4j.appender.error=org.apache.log4j.DailyRollingFileAppender log4j.appender.error.layout=org.apache.log4j.PatternLayout log4j.appender.error.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c - %m%n log4j.appender.error.datePattern='.'yyyy-MM-dd log4j.appender.error.Threshold = ERROR? log4j.appender.error.append=true log4j.appender.error.File=${webApp.root}/WEB-INF/logs/error.log?
將業務邏輯代碼 和 方面代碼 組裝到代理類中 是用Spring 配置文件來實現ApllicationContext.xml 文件中來 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<!-- 配置創建UserDAOImpl的實例 --> <bean id="userDAO" class="com.sun.dao.UserDaoImpl"> </bean> <!-- 配置創建UserBizImpl的實例 --> <bean id="userBiz" class="com.sun.biz.UserBizImpl"> <!-- 依賴注入數據訪問層組件 --> <property name="userdao" ref="userDAO" /> </bean>
<!-- 定義前置通知 --> <bean id="logAdvice" class="com.sun.aop.LoggerAdvice"></bean>
<!-- 定義代理類,名 稱為ub,將通過ub訪問業務類中的方法 --> <bean id="ub" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces"> <value>com.sun.biz.UserBiz</value> </property> <property name="interceptorNames"> <list> <value>logAdvice</value> </list> </property> <property name="target" ref="userBiz"></property> </bean>
</beans>
編制測試類 package com.sun.test;
import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.sun.biz.UserBiz;
public class Test {
/** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //裝配UserbIZimpl事例化 UserBiz userbiz = (UserBiz) context.getBean("ub"); userbiz.addUser("wangming", "485487"); userbiz.delUser(1); }
}
結果顯示 [INFO ] [16:11:10] org.springframework.context.support.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1060478: display name [org.springframework.context.support.ClassPathXmlApplicationContext@1060478]; startup date [Mon Sep 17 16:11:10 CST 2012]; root of context hierarchy [INFO ] [16:11:10] org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [applicationContext.xml] [INFO ] [16:11:10] org.springframework.context.support.ClassPathXmlApplicationContext - Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@1060478]: org.springframework.beans.factory.support.DefaultListableBeanFactory@11daa0e [INFO ] [16:11:10] org.springframework.beans.factory.support.DefaultListableBeanFactory - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@11daa0e: defining beans [userDAO,userBiz,logAdvice,ub]; root of factory hierarchy [INFO ] [16:11:10] com.sun.aop.LoggerAdvice - 前置通知com.sun.biz.UserBizImpl類的addUser方法開始執行 添加用戶wangming成功 [INFO ] [16:11:10] com.sun.aop.LoggerAdvice - 前置通知com.sun.biz.UserBizImpl類的delUser方法開始執行 刪除1成功
成功
轉載于:https://my.oschina.net/sunzy/blog/78956
總結
以上是生活随笔為你收集整理的面向方面编程(Spring AOP)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bada 2D游戏编程之十——关键帧动画
- 下一篇: EDM营销内容撰写要注意的几个方面