Spring AOP是在基于jdk代理形式和cglib形式的融合
public interface IUserDao {
public void save();
public void update();
public void delete();
}
public class Advice implements MethodBeforeAdvice{ @Override public void before(Method method, Object[] args, Object object) throws Throwable { System.out.println(object.getClass().getName()+"的业务逻辑是:"+method.getName()); } }
public class UserDaoIm implements IUserDao{ @Override public void save() { System.out.println("保存用户信息"); } @Override public void update() { System.out.println("更新用户信息"); } @Override public void delete() { System.out.println("删除用户信息"); } }
public static void main(String[] args) { //目标类 IUserDao userDao=new UserDaoIm(); //增强处理类 Advice advice=new Advice(); ProxyFactory proxyFactory=new ProxyFactory(); proxyFactory.addAdvice(advice); proxyFactory.setTarget(userDao); //获取代理 IUserDao userDao2=(IUserDao)proxyFactory.getProxy(); userDao2.save(); }
也可以通过配置的形式:
<!-- 目标对象 --> <bean id="userDao" class="before.UserDaoIm"></bean> <!-- 增强类 --> <bean id="advice" class="before.Advice"></bean> <bean id="after" class="before.after"></bean> <!-- 代理 bena--> <bean id="factory" class="org.springframework.aop.framework.ProxyFactoryBean" p:proxyInterfaces="before.IUserDao" p:target-ref="userDao" p:interceptorNames="advice,after"/>
public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("before/beam.xml"); IUserDao userDaoIm=(IUserDao)context.getBean("factory"); userDaoIm.save(); }
Aspectj注解的方式:
@Repository public class UserDaoIm implements IUserDao{ public void save() { System.out.println("保存用户信息"); } public void update() { System.out.println("更新用户信息"); } public void delete() { System.out.println("删除用户信息"); } }
@Aspect public class Advice { @Before("execution(* save(..))") public void before(){ System.out.println("开始事务提交"); } }
<aop:aspectj-autoproxy></aop:aspectj-autoproxy> <context:component-scan base-package="annotation.**"></context:component-scan> <bean id="advice" class="annotation.Advice"></bean> <!-- <bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"></bean> -->
public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("annotation/beam.xml"); //获取代理lei IUserDao userDao=(IUserDao)context.getBean("userDaoIm"); userDao.save(); }