• 顾问包装通知和注解


     顾问包装通知:  

         通知(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>

      匹配包及方法这里使用正则表达式来实现但与正则也不太一样没有(W w这样的)

      注:

        .  代表单个字符

        *  代表前一项出现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());
    
        }
    
    
    }

      执行结果就不写了

  • 相关阅读:
    二分图的部分关系
    二分图的部分关系
    日常训练赛 Problem C – Complete Naebbirac’s sequence
    日常训练赛 Problem C – Complete Naebbirac’s sequence
    J
    J
    Python strip()方法
    Python startswith()方法
    Python splitlines()方法
    Python split()方法
  • 原文地址:https://www.cnblogs.com/wangdayexinyue/p/11772332.html
Copyright © 2020-2023  润新知