Java动态代理模拟spring的AOP
????? 廣州瘋狂軟件學(xué)院擁有三大課程體系包括:java課程,android課程,ios課程,瘋狂軟件年終鉅惠,報名java就業(yè)班,免費贈送基礎(chǔ)班,名額有限,本月火熱報名中,歡迎有志之士電話或者咨詢。
spring中的AOP是通過Java的動態(tài)代理實現(xiàn)的,有關(guān)動態(tài)代理的詳細(xì)解釋參見:
現(xiàn)在就使用Java的動態(tài)代理模擬AOP(使用JDK的動態(tài)代理)
1.建立實體對象
public class User {
Integer id;
String name;
String pwd;
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
//setter/getter
}
2.建立接口
public interface UserDao {
public void addUser(User user);
}
3.實現(xiàn)接口
public class UserDaoImpl implements UserDao{
@Override
public void addUser(User user){
System.out.println("保存User到數(shù)據(jù)庫中");
throw new RuntimeException();
}
}
4.創(chuàng)建攔截器(這個類就相當(dāng)于aop中的切面類)
public class MyInterceptor implements InvocationHandler {
private Object target;
public MyInterceptor() {
}
public MyInterceptor(Object target) {
this.target = target;
}
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
public void before() {
System.out.println("這是一個前置通知");
}
public void afterReturning() {
System.out.println("這是一個后置通知");
}
public void afterThrowing() {
System.out.println("這是一個異常通知");
}
public void after() {
System.out.println("這是一個最終通知");
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object returnValue = null;
try {
before();
returnValue = method.invoke(target, args);
afterReturning();
} catch (Exception e) {
afterThrowing();
} finally {
after();
}
return returnValue;
}
}
5.通過代理對象實現(xiàn)目標(biāo)方法
@Test
public void testAOP() {
UserDao userDao = new UserDao();
MyInterceptor interceptor = new MyInterceptor();
interceptor.setTarget(userDao);
//通過代理的靜態(tài)方法創(chuàng)建一個代理對象
//這個代理創(chuàng)建的時候,接收了接口類型和攔截器的處理類,在代理的背后,他會調(diào)運攔截器的invoke這個
方法。
//因為傳遞的有接口類型,所以可以強(qiáng)制類型轉(zhuǎn)換到我們指定的接口類型
UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(this.getClass().getClassLoader(),
userDao.getClass().getInterfaces(),
interceptor);
//然后在代理對象處理的時候,就會將我的邏輯織如到被代理的對象上
userDaoProxy.addUser(new User(1, "a", "b"));
}
6.程序輸出
這是一個前置通知
保存User到數(shù)據(jù)庫中
這是一個異常通知
這是一個最終通知
瘋狂Java培訓(xùn)專注軟件開發(fā)培訓(xùn),提升學(xué)員就業(yè)能力,重點提升實踐動手能力。技術(shù)知識沉淀深厚的老師,讓你感受Java的魅力,激發(fā)你對于編程的熱愛,讓你在半年的時間內(nèi)掌握8-10萬的代碼量,掌握J(rèn)ava核心技術(shù),成為真正的技術(shù)高手;通過大量全真企業(yè)項目瘋狂訓(xùn)練,迅速積累項目經(jīng)驗。讓你成為技能型的現(xiàn)代化高端人才,迅速獲得高薪就業(yè)!時間不等人,趕緊聯(lián)系我們吧!瘋狂java培訓(xùn)中心地址:廣州天河區(qū)車陂灃宏大廈3樓。
瘋狂Java培訓(xùn)專注軟件開發(fā)培訓(xùn),提升學(xué)員就業(yè)能力,重點提升實踐動手能力。瘋狂軟件開設(shè)了java課程,ios課程,android課程,為你提供一個學(xué)習(xí)java技能的好機(jī)會,瘋狂軟件特大優(yōu)惠活動,加瘋狂軟件微信號(瘋狂軟件),搶優(yōu)惠,優(yōu)惠100元+贈送iOS教材一本 詳情請看瘋狂java培訓(xùn)官網(wǎng)。IT從業(yè)著仍是社會所需要的高端人才,廣州瘋狂軟件之力于培養(yǎng)企業(yè)所需要的中高端IT人才,讓你成為備受企業(yè)青睞的人才。
?
轉(zhuǎn)載于:https://www.cnblogs.com/gojava/p/3498977.html
總結(jié)
以上是生活随笔為你收集整理的Java动态代理模拟spring的AOP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 亦盾投影仪2022款4K135w国际AN
- 下一篇: Java 性能优化实战记录(2)---句