spring实现代理 :半自动

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:切面类

发布了25 篇原创文章 · 获赞 22 · 访问量 5395

猜你喜欢

转载自blog.csdn.net/weixin_42893085/article/details/104408779