spring实现代理 :半自动
- 让spring自己创建对象,然后我们从spring容器中手动获取代理对象
- 接口 + 实现类
1.接口
public interface UserService {
public void addUser();
public void updateUser();
public void deleteUser();
}
2.实现类
public class UserServiceImpl implements UserService {
@Override
public void addUser() {
System.out.println("factory addUser");
}
@Override
public void updateUser() {
System.out.println("factory updateUser");
}
@Override
public void deleteUser() {
System.out.println("factory deleteUser");
}
}
3.切面类
public class MyAspect implements MethodInterceptor{
@Override
public Object invoke(MethodInvocation mi) throws Throwable {
System.out.println("ss前");
//手动执行目标方法
Object o = mi.proceed();
System.out.println("ss后");
return o;
}
}
注意:这里的MethodInterceptor是指环绕通知 。
环绕通知 :必须手动执行目标方法
AOP联盟为通知Advice定义了org.aopalliance.aop.Advice
分为五类:
1.前置通知 org.springframework.aop.MethodBeforeAdvice
2.后置通知 org.springframework.aop.AfterReturningAdvice
3.环绕通知 org.aopalliance.intercept.MethodInterceptor
4.异常抛出通知 org.springframework.aop.ThrowsAdvice
5.引介通知 org.springframework.aop.IntroductionInterceptor
3.spring的配置
<!-- 1. 创建目标类 -->
<bean id="userServiceId" class="com.itt.c_factory_bean.UserServiceImpl"></bean>
<!-- 2. 创建切面类-->
<bean id="aspectId" class="com.itt.c_factory_bean.MyAspect"></bean>
<!-- 3. 创建代理类-->
<bean id="proxyServiceId" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="userServiceId"></property>
<property name="interfaces" value="com.itt.c_factory_bean.UserService"></property>
<property name="interceptorNames" value="aspectId"></property>
</bean>
最后就是spring的注入的问题:
1.target:目标类
2.interfaces:实现方法的接口
3.interceptorNames:切面类