oss如何做网站,广汉网站建设,免费域名网站申请,北京网站建设亿玛酷适合5动态代理#xff1a;指的就是通过一个代理对象来创建需要的业务对象#xff0c;然后在这个代理对象中统一进行各种需求的处理。 学习完Spring后会发现#xff0c;Spring中的AOP#xff08;面向方面编程#xff1a;Aspect Oriented Programming#xff09;是个很重要的知识… 动态代理指的就是通过一个代理对象来创建需要的业务对象然后在这个代理对象中统一进行各种需求的处理。 学习完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.targeto;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-methodgetInstance。参考代码如下 bean iduserDynamicDao classcom.proxy.LogProxy factory-methodgetInstance!-- 构造方法中引用userDao --constructor-arg refuserDao//bean 如果采用annotation来注入则直接在userService类中的setUserDao方法前面加上注解Resource(nameuserDynamicDao) 就可以了 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(nameuserDynamicDao)//采用代理来注入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.idid;this.usernameusername;}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 iduserDao classcom.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(删除idid);}public User load(int id) {System.out.println(加载idid);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 version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:aophttp://www.springframework.org/schema/aopxmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://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-packagecom/bean iduserDynamicDao classcom.proxy.LogProxy factory-methodgetInstance!-- 构造方法中引用userDao --constructor-arg refuserDao//bean
/beans 转载于:https://www.cnblogs.com/misterzxy/p/3548859.html