zoukankan      html  css  js  c++  java
  • 注解方式实现IOC和AOP

     3.1 IOC和DI的注解

          IOC:

    • @Component:实现Bean组件的定义
    • @Repository:用于标注DAO类,功能与@Component作用相当
    • @Service:用于标注业务类
    • @Controller:用于标注控制器

          DI:

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

     AOP:

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

    使用注解方法实现AOP的案例

    第一步:xml文件中配置包扫描器和开启Spring对AOP注解的支持

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
        <!--开启Spring IOC的注解支持 base-package 包扫描语句 com.yjc包下的注解-->
        <context:component-scan base-package="com.yjc"/>
        <!--开启Spring AOP注解的支持-->
        <aop:aspectj-autoproxy/>
    </beans>

    第二步:创建业务类

    package com.yjc.annotate;
    
    import org.springframework.stereotype.Service;
    
    @Service("doSomeServiceImpl")//把此类放入到spring容器中,标识这是个Service
    public class DoSomeServiceImpl  {
    
        public void doSome() {
            System.out.println("doSome===============================");
        }
    
    
        public void say() {
            System.out.println("say==========================================");
        }
    }
    package com.yjc.annotate;
    
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.*;
    import org.springframework.aop.AfterReturningAdvice;
    import org.springframework.aop.MethodBeforeAdvice;
    import org.springframework.stereotype.Component;
    
    import java.lang.reflect.Method;
    @Aspect   //表示这个类是一个切面类
    @Component  //必须要把切面类也放入到Bean容器当中
    public class AnnotateAdvice {
       //定义切点,方法不需要实现 @Pointcut(
    "execution(* com.yjc.annotate.*.*(..))") public void poincut(){ }
      //参数为切点 @Before(
    "poincut()") public void Before(){ System.out.println("俺是前置增强"); } /* @AfterReturning public void AfterReturning(){ System.out.println("俺是后置增强"); } @After("poincut()") public void After(){ System.out.println("额是最终增强"); } @Around("poincut()") public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { System.out.println("前置"); proceedingJoinPoint.proceed(); System.out.println("后置"); }*/ /* @AfterThrowing(pointcut = "poincut()", throwing = "e") public void execption(JoinPoint joinPoint,RuntimeException e){ System.out.println(joinPoint.getSignature().getName()+"方法发生:"+e); }*/ }

    第四步:测试类

    package com.yjc.annotate;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class AnnotateTest {
        public static void main(String[] args) {
            ApplicationContext applicationContext=new ClassPathXmlApplicationContext("com/yjc/annotate/application_annotate.xml");
          //获取Service层的Bean对象 DoSomeServiceImpl proxyFactory
    = applicationContext.getBean("doSomeServiceImpl", DoSomeServiceImpl.class); proxyFactory.doSome(); proxyFactory.say(); } }

    第五步:测试

    上面的一个小例子就是用我们注解实现IOC声明和AOP的增强,五种增强的实现方式大致一样,这里就不再赘述

  • 相关阅读:
    幂等性
    视频上墙
    java 字符串 大小写转换 、去掉首末端空格 、根据索引切割字符 、判断是否含有某连续字符串
    Java 递归 常见24道题目 总结
    Java 单引号 与 双引号 区别
    细谈 Java 匿名内部类 【分别 使用 接口 和 抽象类实现】
    细谈 == 和 equals 的具体区别 【包括equals源码分析】
    简单谈谈 数组排序 的方法 【自定义算法 、 冒泡算法 等】
    细说 栈 为什么又被称为 栈堆 ?【得从数组变量讲起】
    简单谈谈 堆、栈、队列 【不要傻傻分不清】
  • 原文地址:https://www.cnblogs.com/yjc1605961523/p/11778216.html
Copyright © 2011-2022 走看看