1、静态代理
- 创建代理类
必要条件:
1、代理、目标对象实现同样接口;
2、代理类继承目标类
public class PersonProxy implements PersonService {
//目标对象
private PersonService target;
// set
public void setTarget(PersonService target) {
this.target = target;
}
@Override
public Boolean login(String name, String password) {
System.out.println("-------------日志--------------");
Boolean result = target.login(name, password);
System.out.println("-------------日志--------------");
return result;
}
}
- 配置Bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean name="personService" class="com.baibai.proxy.PersonProxy">
<property name="target">
<bean class="com.baibai.impl.PersonServiceImpl"/>
</property>
</bean>
</beans>
- 业务层
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
PersonService service = context.getBean("personService", PersonService.class);
service.login("bill","123456");
2、动态代理
程序运行过程中动态生成代理类的字节码(动态字节码技术)
- JDK自带(代理类和目标类事项同一接口)
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
PersonService target = context.getBean("personService", PersonService.class);
ClassLoader loader = getClass().getClassLoader();
PersonService cproxy = (PersonService)Proxy.newProxyInstance(loader, target.getClass().getInterfaces(), (Object proxy, Method method, Object[] args) -> {
System.out.println("------------日志输出---------------");
//调用目标对象的目标方法
Object result = method.invoke(target, args);
System.out.println("------------日志输出---------------");
return result;
});
cproxy.login("alibaba", "123456");
context.close();
- CGlib(代理类继承目标类)
网友评论