spring_顾问 

 

  通知(advice)是Spring中的一种比较简单的切面,只能将切面织入到目标类的所有方法中,而无法对指定方法进行增强

       顾问(advisor)是Spring提供的另外一种切面,可以织入到指定的方法中   接口 PointcutAdvisor

  实现类:

    NameMatchMethodPointcutAdvisor(名称匹配方法切入点顾问),

    RegexpMethodPointcutAdvice(正则匹配切入点顾问)

一、名称匹配方法切入点顾问

  1.接口及其实现类

public void doSome();
public void doSome() {
        System.out.println("123");
    }

  2.增强类

public class BeaforeAdvisor implements MethodBeforeAdvice {
    @Override
    public void before(Method method, Object[] objects, Object o) throws Throwable {
        System.out.println("前置==========");
    }
}

  3.大配置文件

  
<!--目标对象注入-->
<bean id="proServiceimpl" class="cn.spring.advisor.ProServiceImpl"></bean> <!--增强类注入--> <bean id="beaforeAdvisor" class="cn.spring.advisor.BeaforeAdvisor"></bean> <!--顾问--> <bean id="advisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor" > <property name="advice" ref="beaforeAdvisor"></property> <property name="mappedNames" value="doSome"></property> </bean> <!--使用代理工厂--> <bean id="ProFactory" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target" ref="proServiceimpl"></property> <property name="interceptorNames" value="advisor"></property> </bean>

二、正则匹配的切入点顾问

<!--目标对象注入-->
<bean id="proServiceimpl" class="cn.spring.advisor.ProServiceImpl"></bean>
<!--增强类注入-->
    <bean id="beaforeAdvisor" class="cn.spring.advisor.BeaforeAdvisor"></bean>
<!--顾问-->
<bean id="advisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor" >
        <property name="advice" ref="beaforeAdvisor"></property>
       <property name="pattern" value=".*do.*"></property>
    </bean>
<!--使用代理工厂-->
    <bean id="ProFactory" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="target" ref="proServiceimpl"></property>
        <property name="interceptorNames" value="advisor"></property>
    </bean>

三、顾问的自动代理

  顾问代理生成器,当我们声明好顾问后为目标对象生成代理对象。如果项目中 存在多个代理对象的话,需要实例化许多的ProxyFactoryBean,我们可以使用顾问代理生成器来解决这个问题。  

        顾问代理生成器主要分两种

  • 默认顾问代理生成器:DefaultAdvisorAutoProxyCreator
  • 名称顾问代理生成器:BeanNameAutoProxyCreator

  1.默认顾问自动代理生成器

 <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"></bean>

  2.名称顾问代理生成器

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<!--指定目标对象进行织入 多个对象用,分割--> <property name="beanNames" value="proServiceimpl,beanTest"></property>
<!--指定顾问-->
     <property name="interceptorNames" value="advisor"></property> </bean>

  

Spring_IOC/AOP注解

一、IOC注解

  1.用于向Spring容器中注入bean:

  • @Component:向Spring容器中注入bean
  • @Repository:用于标注Dao层
  • @Service:用于标注Service业务层
  • @Controller:用于标注控制器类

  2.用于得到数据,实现Bean组件的装配

  • @Autowired:默认ByType方式,如果出现同名类,则不能按照Type进行注入 需要使用@Qualifier 指明ID
  • .@Resource: 默认ByName方式,如果name确实默认按照ByType方式注入

  案例实现IOC注解

    (1).大配置文件中加入包扫描仪,扫描包中的注解

 <context:component-scan base-package="cn.spring.aop"/>

         base-package中填写的是包名,多个包名用‘,’区分

    (2).定义相应的接口及实现类

@Repository("mapperImpl")
public class MapperImpl implements Mapper {
    @Override
    public int add(StudentBean stu) {
        System.out.println("123");
        return 0;
    }
}
@Service("StuServiceImpl")
public class StuServiceImpl implements StuService {
    @Resource
    private Mapper mapper;
    @Override
    public int add(StudentBean stu) {
        return mapper.add(stu);
    }
}

    (3).测试类

@Test
    public  void IocTestBy(){
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        StuService stuServiceImpl = (StuService)context.getBean("StuServiceImpl");
        stuServiceImpl.add(new StudentBean());
    }

二、AOP注解

  • @Aspect :声明切面
  • @Ponitcut :声明公共的切点表达式
  • @Before :前置增强
  • @AfterReturning: 后置增强
  • @Around :环绕增强
  • @AfterThrowing :异常抛出增强
  • @After: 最终增强

  注解实现各种增强

    (1).大配置文件中开启aop注解

 <aop:aspectj-autoproxy/>

    (2).接口实现

@Service("aopServices")
public class AopServices{
    public void doSome() throws Exception{
      /* int i=1/0;*/
        System.out.println("Service层业务");
    }
}

    (3).增强类

@Aspect
@Component
public class Advices {
    //设定切入点表达式
    @Pointcut("execution(* *..aop.*.*(..))")
    public  void  Pointcut(){

    }

    //前置增强
    @Before("Pointcut()")
    public void before(){
        System.out.println("=======前置=========");
    }

    //后置增强
    @AfterReturning("Pointcut()")
    public  void afterReturning(){
        System.out.println("=======后置==========");
    }

    //环绕增强
    @Around("Pointcut()")
    public Object Around(ProceedingJoinPoint jp) throws Throwable {

        System.out.println("=======环绕前==========");
        Object proceed = jp.proceed();
        System.out.println("=======环绕后==========");
        return proceed;
    }

    //异常增强
    @AfterThrowing(pointcut = "execution(* *..aop.*.*(..))",throwing = "ex")
    public void AfterThrowing(Exception ex){
        System.out.println("发生异常");
    }

    //最终增强
    @After("Pointcut()")
    public void After(){
        System.out.println("=======最终增=========");
    }
}

    (4).测试类

public class AopTest {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        AopServices aopServices = (AopServices)context.getBean("aopServices");
        try {
            aopServices.doSome();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
01-12 11:01