顾问包装通知和注解

时间:2019-10-31
本文章向大家介绍顾问包装通知和注解,主要包括顾问包装通知和注解使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

 顾问包装通知:  

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

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

    实现类:NameMatchMethodPointcutAdvisor(基于方法名称的增强顾问),RegexpMethodPointcutAdvice(基于正则表达式的增强顾问)

首先创建测试用例:

  IService类: 

package com.wdy;

public interface IService {
    public void doSome();
    public  void Say();
}

 

  IService实现类:  

package com.wdy;

public class IServiceImpl implements IService {
    public void doSome() {
        System.out.println("---呵呵业务---");
    }

    public void Say() {
        System.out.println("++++dadad++++");
    }
}

  增强类:

package com.wdy;

import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;

import java.lang.reflect.Method;

public class MyAdvisor implements AfterReturningAdvice, MethodBeforeAdvice {
    public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
        System.out.println("++++之后++++");
    }

    public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println("++++之前++++");
    }
}

  application_after.xml  配置文件

顾问代理生成器

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

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

  • 自动顾问代理生成器:DefaultAdvisorAutoProxyCreator
  • 名称顾问代理生成器:BeanNameAutoProxyCreator
    <bean id="iServiceImpl" class="com.wdy.IServiceImpl"></bean>
    <bean id="myAdvisor" class="com.wdy.MyAdvisor"></bean>

    <bean id="advisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
        <property name="advice" ref="myAdvisor"></property>
        <property name="patterns">
            <list>
                <value>.*do.*</value>
            </list>
        </property>
    </bean>
    <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
        <property name="beanNames" value="iServiceImpl"></property>

        <property name="interceptorNames" value="advisor"></property>
    </bean>

  注:

    .  代表单个字符

    *  代表前一项出现0-n次

    +  代表前一项出现1-n次

  匹配时方法名最好两个或以上字符

  测试类:  

import com.wdy.IService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyAdvisorTest {
    public static void main(String[] args) {
        ApplicationContext ctx=new ClassPathXmlApplicationContext("application_after.xml");
        IService serv=(IService) ctx.getBean("iServiceImpl");
        System.out.println("*********************");
        serv.doSome();
        serv.Say();


        System.out.println("***********----------");


    }

}

执行结果:

  名称顾问代理生成器也可以替换成自动顾问代理生成器,自动顾问代理生成器默认为Spring中所有的Bean对象创建代理 无需使用ID注入

注解方式实现IOC和AOP

     3.1 IOC和DI的注解

        IOC:

                          @Component:实现Bean组件的定义

                          @Repository:用于标注DAO类,功能与@Component作用相当

                          @Service:用于标注业务类

                          @Controller:用于标注控制器

              DI:

                          @Resource(name="userService")

                               默认ByName方式,如果name确实默认按照ByType方式注入

                          @Autowired

                              默认ByType方式,如果出现同名类,则不能按照Type进行注入

                            需要使用@Qualifier 指明ID

首先配置application_after.xml文件(我这里叫这个名字):

  

    <!-- 注解支持 -->
    <context:annotation-config></context:annotation-config>
    <!-- 扫描:当前包中的类和子包中的类 -->
    <context:component-scan base-package="com.wdy"/>

  因为首先需要项目支持注解

  Dao层:

package com.wdy.mapper;

import com.wdy.entity.IUser;

public interface IUserMapper {
    public int Xunxi(IUser user);
}

package com.wdy.mapper;


import com.wdy.entity.IUser;
import org.springframework.stereotype.Repository;

@Repository
public class IUserMapperImpl implements IUserMapper {
    public int Xunxi(IUser user) {
        System.out.println("呵呵123456");
        return 1;
    }
}

  service层:

package com.wdy.service;

import com.wdy.entity.IUser;

public interface IUserService {
    public int Xunxi(IUser user);

}
package com.wdy.service;

import com.wdy.entity.IUser;
import com.wdy.mapper.IUserMapper;
import javax.annotation.*;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service("iUserServiceImpl")
public class IUserServiceImpl implements IUserService {

    @Autowired
private IUserMapper iUserMapper;

    public int Xunxi(IUser user) {
        return iUserMapper.Xunxi(user);
    }
}

  测试类:

import com.wdy.entity.IUser;
import com.wdy.service.IUserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;



public class IocTest {

    public static void main(String[] args) {
        ApplicationContext ctx=new ClassPathXmlApplicationContext("application_after.xml");
        IUserService ius=(IUserService) ctx.getBean("iUserServiceImpl");
        ius.Xunxi(new IUser());

    }


}

  执行结果就不写了

原文地址:https://www.cnblogs.com/wangdayexinyue/p/11772332.html