动态代理:这样操作发现出现了大量重复的代码,如果有十处、一百处需要同样的处理那么代码需要重复十次、一百次。当然我们可以把这些功能封装成一个增强方法,然后在功能方法中进行调用,但是也出现了方法的十处、一百处的调用操作,一旦增强方法名字改变,就需要完成所有调用处代码的修改。或者有一天不需要这些增强操作了,就再次需要在这十处、一百处删除方法调用。所以这种操作不适用于大型的项目开发的需求,此时我们就必须使用Java的动态代理机制。
1.导入jar包并创建对应的包和类
2.创建接口,定义接口的规范,即功能方法的定义。
package com.yun.service;
public interface BookService {
void save();
void del();
void update();
void find();
}
3.定义实现接口的子类,实现接口定义的方法,实现核心功能
package com.yun.service.impl;
import com.yun.service.BookService;
public class BookServiceimpl implements BookService {
@Override
public void save() {
System.out.println("添加");
}
@Override
public void del() {
System.out.println("删除");
}
@Override
public void update() {
System.out.println("修改");
}
@Override
public void find() {
System.out.println("查询");
}
}
4.定义代理类,在代理类中对被代理对象进行方法增强。
package com.yun.advice;
public class Loger {
public void check(){
System.out.println("执行系统的权限验证");
}
public void logPrint(){
System.out.println("执行系统的权限验证");
}
}
5.写入spring核心配置文件
<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"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 1.把所有类的对象交给IOC容器进行管理 -->
<!-- 2.AOP的配置:让增强类 的 哪个方法 动态进行何种增强 核心类 的 哪个方法 -->
<bean id="loger" class="com.yun.advice.Loger"/>
<bean id="bookService" class="com.yun.service.impl.BookServiceimpl"/>
<aop:config>
<aop:aspect id="log" ref="loger">
<aop:before method="check" pointcut="execution(* *..*.*(..))"/>
</aop:aspect>
</aop:config>
</beans>
6.创建测试类并运行
package com.yun.servlet;
import com.yun.service.BookService;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test01 {
@Test
public void test01(){
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("spring.xml");
BookService bookService=context.getBean(BookService.class);
bookService.save();
bookService.del();
bookService.update();
bookService.find();
}
}