javascript
Spring中的动态代理
動態代理:指的就是通過一個代理對象來創建需要的業務對象,然后在這個代理對象中統一進行各種需求的處理。
學習完Spring后會發現,Spring中的AOP(面向方面編程:Aspect Oriented Programming)是個很重要的知識點。實現AOP,我們一般采用代理的方式來實
現,這樣可以減少重復代碼的編寫,也符合了OCP原則,即:對修改關閉,對擴展開放。其創建過程如下:
步驟1:編寫一個類實現InvocationHandler接口,例如:LogProxy類
步驟2:在類中創建一個代理對象,例如:private Object target;
步驟3:在類中創建一個方法來生成對象,這個方法的參數是指要代理的對象,getInstacne所返回的對象就是代理對象,例如:public static Object getInstance(Object o){ return null}
步驟3.1:創建LogProxy對象,例如:LogProxy proxy = new LogProxy();
步驟3.2:設置這個代理對象,例如:proxy.target = o;
步驟3.3:通過Proxy的方法創建代理對象,第一個參數是要代理對象的classLoader,第二個參數是要代理對象實現的所有接口,第三個參數是實現類
InvocationHandler的對象,此時的result就是一個代理對象,代理的是o,例如:Object result = Proxy.newProxyInstance(o.getClass().getClassLoader(),?
o.getClass().getInterfaces(), proxy);
步驟4:當有了代理對象之后,不管這個代理對象執行什么方法,都會調用invoke方法,只要在該方法中作相應操作就可以了。
創建該類的具體代碼如下:
package com.proxy;import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;public class LogProxy implements InvocationHandler {private Object target;public static Object getInstance(Object o){LogProxy proxy = new LogProxy();proxy.target=o;Object result = Proxy.newProxyInstance(o.getClass().getClassLoader(),o.getClass().getInterfaces() , proxy);return result;}public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {Logger.info("進行了相關的操作");Object obj = method.invoke(target, args);return obj;}}
接下來就是調用該類進行注入了。首先,需要在applicationContent.xml配置文件中的bean中調用LogProxy類,并且采用工廠方法的方式,即:factory-method="getInstance"。參考代碼如下:
<bean id="userDynamicDao" class="com.proxy.LogProxy" factory-method="getInstance"><!-- 構造方法中引用userDao --><constructor-arg ref="userDao"/></bean>如果采用annotation來注入,則直接在userService類中的setUserDao方法前面加上注解:@Resource(name="userDynamicDao") 就可以了
package com.service;import javax.annotation.Resource;import org.springframework.stereotype.Component; import org.springframework.stereotype.Service;import com.dao.IUserDao; import com.model.User; import com.sun.xml.internal.bind.v2.runtime.Name; @Service("userService")//業務層一般用Service public class UserService implements IUserService {private IUserDao userDao;public void add(User user) {userDao.add(user);}public void delete(int id) {userDao.delete(id);}public IUserDao getUserDao() {return userDao;}public User load(int id) {return userDao.load(id);}@Resource(name="userDynamicDao")//采用代理來注入public void setUserDao(IUserDao userDao) {this.userDao = userDao;}}相關的類如下:
package com.model;public class User {private int id;private String username;public User() {}public User(int id, String username) {this.id=id;this.username=username;}public int getId() {return id;}public String getUsername() {return username;}public void setId(int id) {this.id = id;}public void setUsername(String username) {this.username = username;}@Overridepublic String toString() {return "User [id=" + id + ", username=" + username + "]";} } package com.dao;import org.springframework.stereotype.Component; import org.springframework.stereotype.Repository;import com.model.User;//@Component("userDao")//等于完成了<bean id="userDao" class="com.dao.UserDao" /> @Repository("userDao")//@Repository一般用于DAO的注入 public class UserDao implements IUserDao {public void add(User user) {System.out.println("添加用戶:"+user);}public void delete(int id) {System.out.println("刪除id:"+id);}public User load(int id) {System.out.println("加載id:"+id);return null;}} package com.dao;import com.model.User;public interface IUserDao {public void add(User user);public void delete(int id);public User load(int id);} package com.proxy;import java.util.Date;public class Logger {public static void info(String info){System.out.println(new Date()+"---->"+info);} } package com.service;import com.model.User;public interface IUserService {public void add(User user);public void delete(int id);public User load(int id); }相應的配置文件:
<?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:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.0.xsd"><!-- 打開Spring的Annotation支持 --><context:annotation-config/><!-- 設定Spring 去哪些包中找Annotation --><context:component-scan base-package="com"/><bean id="userDynamicDao" class="com.proxy.LogProxy" factory-method="getInstance"><!-- 構造方法中引用userDao --><constructor-arg ref="userDao"/></bean> </beans>?
轉載于:https://www.cnblogs.com/misterzxy/p/3548859.html
總結
以上是生活随笔為你收集整理的Spring中的动态代理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#反射——简单反射操作类的封装
- 下一篇: JavaScript面向对象--封装