Spring之 AOP动态代理
package com.fxr.spring.action; import java.util.List; import javax.annotation.Resource; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import com.fxr.spring.model.User; import com.fxr.spring.service.UserService; @Controller("useraction")//MVC控制层一般使用@Controller @Scope("prototype")//设置为多例模式 public class UserAction { private User u; private int id; private UserService userservice; private List<String>names; public List<String> getNames() { return names; } public void setNames(List<String> names) { this.names = names; } public UserAction(){ } public User getU() { return u; } public void setU(User u) { this.u = u; } public int getId() { return id; } public void setId(int id) { this.id = id; } public UserService getUserservice() { return userservice; } @Resource public void setUserservice(UserService userservice) { this.userservice = userservice; } public void add(){ userservice.add(u); } public void delete(){ userservice.delete(id); } } ================================================= package com.fxr.spring.dao; import com.fxr.spring.model.User; public interface IUserDao { public void add(User u); public void delete(int id); } package com.fxr.spring.dao; import org.springframework.stereotype.Component; import org.springframework.stereotype.Repository; import com.fxr.spring.model.User; //@Component("userdao")//公共的创建bean的Annotation @Repository("userdao")//@Repository一般用于DAO的注入 public class UserDao implements IUserDao{ @Override public void add(User u) { System.out.println("添加"+u); } @Override public void delete(int id) { System.out.println("删除"+id); } } package com.fxr.spring.dao; import javax.annotation.Resource; import org.springframework.stereotype.Repository; import com.fxr.spring.model.User; import com.fxr.spring.util.Logger; @Repository("userproxydao") public class UserProxyDao implements IUserDao{ private IUserDao user; public IUserDao getUser() { return user; } @Resource public void setUser(IUserDao user) { this.user = user; } @Override public void add(User u) { Logger.info("添加用户"); System.out.println("添加"+u); } @Override public void delete(int id) { Logger.info("删除用户"); System.out.println("删除"+id); } } package com.fxr.spring.model; public class User { private int id; private String name; public User(int id,String name){ this.id = id; this.name = name; } public User(){ } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User [id=" + id + ", name=" + name + "]"; } } package com.fxr.spring.service; import com.fxr.spring.dao.UserDao; import com.fxr.spring.model.User; public interface IUserService { public void add(User u); public void delete(int id); } package com.fxr.spring.service; import javax.annotation.Resource; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import com.fxr.spring.dao.IUserDao; import com.fxr.spring.dao.UserDao; import com.fxr.spring.model.User; @Component("userservice") @Service("userservice")//业务层一般使用@Service public class UserService implements IUserService{ private IUserDao userdao; public IUserDao getUserdao() { return userdao; } @Resource(name="userDynamicDao") public void setUserdao(IUserDao userdao) { this.userdao = userdao; } @Override public void add(User u) { userdao.add(u); } @Override public void delete(int id) { userdao.delete(id); } } package com.fxr.spring.test; import org.springframework.beans.factory.BeanFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.fxr.spring.action.UserAction; import com.fxr.spring.model.HelloWorld; import com.fxr.spring.model.User; public class Test { private static BeanFactory factory = new ClassPathXmlApplicationContext("bean.xml"); public static void main(String[] args) { // //创建一个类 // HelloWorld hello = (HelloWorld) factory.getBean("helloworld"); // hello.say(); //创建一个类 UserAction ua1 = (UserAction) factory.getBean("useraction"); User u = new User(1,"张三"); ua1.setU(u); ua1.add(); // UserAction ua2 = (UserAction) factory.getBean("useraction"); // ua2.add(); } } package com.fxr.spring.util; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class LogProxy implements InvocationHandler{ //创建对象 private Object target; private LogProxy(){} //3:创建一个方法生成对象,这个方法的参数就是要代理的对象,getInstance所返回的对象就是代理的对象 public static Object getInstance(Object o){ //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); return result; } /** * 当有了这个代理对象之后,不管这个代理对象执行什么方法,都会调用以下的invoke的方法 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Logger.info("进行相应的操作"); Object obj = method.invoke(target, args); return obj; } } <?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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- 打开Spring的Annotation支持 --> <context:annotation-config/> <!-- 设定Spring 去哪些包中找Annotation --> <context:component-scan base-package="com.fxr.spring"/> <bean id="userDynamicDao" class="com.fxr.spring.util.LogProxy" factory-method="getInstance"> <constructor-arg ref="userdao"/> </bean> </beans>