spring对AOP的支持
spring采用对AOP的支持(采用Annotation @...,或者采用配置文件的方式)
导入包aspectjrt.jar aspectjweaver.jar 是实现aop最全的两个包 采用静态编译
而非运行时编译,效率上会高些
横切关注点模块化就是切面
切面默认情况下不需要接口,但对于目标对象,必须要有接口.
package zhc.love.dj.test; public interface UserManger { public void addUser(String name,String password); public void delUser(int id) ; public void modUser(int id,String name,String password); }
package zhc.love.dj.test; public class UserMangerImp implements UserManger { public void addUser(String name, String password) { System.out.println("==============UserMangerImp.addUser()==================="); } public void delUser(int id) { System.out.println("==============UserMangerImp.delUser()==================="); } public void modUser(int id, String name, String password) { System.out.println("==============UserMangerImp.modUser()==================="); } }
package zhc.love.dj.test; import org.springframework.beans.factory.BeanFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Client { public static void main(String[] args) { //用spring的类来加载配置文件 BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml"); //通过工厂产生类 调用对应类的id UserManger mangaer = (UserManger)factory.getBean("UserManger"); //mangaer.addUser("zhang", "jingjing"); mangaer.delUser(1); } }
package zhc.love.dj.test; public interface MySecurtyManger { public void checkSecurity(); }
package zhc.love.dj.test; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; //定义切面,横切关注点.采用Annotation方式 @Aspect public class MySecurtyMangerImp implements MySecurtyManger { //标识方法,不会被类用,定义切入点名称.没有返回值 //该方法只是一个标记.标识切入点的内容是一个表达式.来描述切入哪些对象,哪些方法 //定义表达式,切入无论是否有返回值,add的任何方法,有没有参数都会执行切入,execution中第一个* 是返回值的意思 //add* 以add开头的方法 //add*(..) 以add开头的有没有参数的的方法. @Pointcut("execution(* add*(..))||execution(* del*(..))") private void allAddMethod(){} //定义advice ,定义这个advice织入到哪,在哪些切入点的何处织入.比如在切入点的前面,后面等. //将checkSecurity()方法织入到所有allAddMethod()方法前头 @Before("allAddMethod()") public void checkSecurity() { System.out.println("=========checkSecurity()========="); } //需要在配置文件中支持Annotation方式 }
<?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:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"> <!-- 配置文件中支持Annotation方式 --> <aop:aspectj-autoproxy /> <!-- srping方式,所以得先配置 --> <bean id="MySecurtyMangerImp" class="zhc.love.dj.test.MySecurtyMangerImp"></bean> <bean id="UserManger" class="zhc.love.dj.test.UserMangerImp"></bean> </beans>