昆明java培训
达内昆明广州春城路

18487146383

热门课程

Java培训班:JDK动态代理

  • 时间:2016-10-21
  • 发布:昆明Java培训
  • 来源:达内新闻

昆明Java培训班的老师发现,此时代理对象和目标对象实现了相同的接口,目标对象作为代理对象的一个属性,具体接口实现中,可以在调用目标对象相应方法前后加上其他业务处理逻辑。

代理模式在实际使用时需要指定具体的目标对象,如果为每个类都添加一个代理类的话,会导致类很多,同时如果不知道具体类的话,怎样实现代理模式呢?这就引出动态代理。

JDK动态代理只能针对实现了接口的类生成代理。

看看代码:

dao实现类

public class UserDaoImpl implements UserDao {

public void add() {

System.out.println("add success");

}

}

ProxySubject

public class ProxySubject implements Subject {

private Subject realSubject;

public String request() {

System.out.println("代理增强");

return realSubject.request();

}

public Subject getRealSubject() {

return realSubject;

}

public void setRealSubject(Subject realSubject) {

this.realSubject = realSubject;

}

public class RealSubject implements Subject {

public String request() {

// TODO Auto-generated method stub

return "真实主题";

}

}

*/

public interface Subject {

public String request();

}

test

public static void main(String[] args) {

/**

*静态代理

*/

/*Subject sub=new RealSubject();//被代理对象

System.out.println(sub.toString());

ProxySubject ps=new ProxySubject();//代理对象

System.out.println(ps.toString());

ps.setRealSubject(sub);

String request = ps.request();//走真实代理对象 RealSubject

System.out.println(request);*/

/**

*动态代理

*/

final UserDao dao=new UserDaoImpl();

//代理对象

//第一个参数:获取和dao一样的类加载器,通过反射机制获取类加载器

//new InvocationHandler()叫匿名内部类,拿到了接口的实现类

UserDao newProxyInstance = (UserDao) Proxy.newProxyInstance(dao.getClass().getClassLoader(), dao.getClass().getInterfaces(), new InvocationHandler() {

//newProxyInstance被代理对象

public Object invoke(Object ewProxyInstance, Method method, Object[] args)

throws Throwable {

System.out.println("增强");

//原始对象 dao    真正的dao   

Object invoke = method.invoke(dao, args);

System.out.println("记录日志");

return invoke;

}

});

//增强代理对象,方法

newProxyInstance.add();

}

对代码的剖析:

Proxy

InvocationHandler

实现了invoke()

Method

applicationContext.xml

<bean id="service" class="cn.wgy.day01.service.UserService"></bean>

<bean id="error" class="cn.wgy.day01.aop.ErrorLog"/>

<aop:config>

<aop:pointcut expression="execution(public void delete())" id="pointcut"/>

<!--异常抛出增强-->

<aop:advisor advice-ref="error" pointcut-ref="pointcut"/>

</aop:config>

</beans>

了解详情请登陆昆明达内Java培训官网(km.Java.tedu.cn)!

上一篇:java程序员:代理模式的定义
下一篇:Java培训:CGLIB代理

程序猿必学之Java 9——昆明达内

java集合-Iterator迭代

达内编程培训大神带你修炼技术!

AI初创企谷歌跑在前面了!达内java培训

选择城市和中心
贵州省

广西省

海南省