ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AOP学习记录及@Configuration注解使用

2021-04-14 15:00:52  阅读:218  来源: 互联网

标签:run Pet User AOP 组件 注解 Configuration class user01


AOP面向切面,为什么要面向切面?哪些操作需要AOP编程?

​ Aop主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合的隔离效果。

​ 比如我们最常见的就是日志记录了,举个例子,我们现在提供一个查询学生信息的服务,但是我们希望记录有谁进行了这个查询。如果按照传统的OOP的实现的话,那我们实现了一个查询学生信息的服务接口(StudentInfoService)和其实现 类 (StudentInfoServiceImpl.java),同时为了要进行记录的话,那我们在实现类(StudentInfoServiceImpl.java)中要添加其实现记录的过程
​ 当要实现的服务有多个时,那就要在每个实现类都添加这些记录过程,这就非常繁琐,而且每个实现类都与记录服务日志的行为紧耦合,违反了面向对象的规则。

一般oop模式:

在这里插入图片描述

每一个模块都跟日志、事务这些功能交织在一起,无法分离,每当修改日志的形式的时候,需要非常多的代码。

aop模式:

在这里插入图片描述

输入的数据先经过日志、事务等控制模块,然后再流向实际的业务模块,而日志、事务这些控制模块看起来就像一道切面,切在数据流的中间

优势:

  1. 解耦
  2. 重复利用代码
  3. 便于装卸

Configuration使用示例

1、配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的

2、配置类本身也是组件

3、proxyBeanMethods:代理bean的方法

 Full(proxyBeanMethods = true)、【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
 Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】

组件依赖必须使用Full模式默认。其他默认是否Lite模式

@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {

/**

 * Full:外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
 * @return
   */
   @Bean //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
   public User user01(){
   User zhangsan = new User("zhangsan", 18);
   //user组件依赖了Pet组件
   zhangsan.setPet(tomcatPet());
   return zhangsan;
   }

@Bean("tom")
public Pet tomcatPet(){
    return new Pet("tomcat");
}
    
}

@Configuration测试代码如下

@SpringBootApplication
相当于
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.atguigu.boot")
public class MainApplication {
public static void main(String[] args) {
    //1、返回我们IOC容器
    ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);

    //2、查看容器里面的组件
    String[] names = run.getBeanDefinitionNames();
    for (String name : names) {
        System.out.println(name);
    }

    //3、从容器中获取组件

    Pet tom01 = run.getBean("tom", Pet.class);

    Pet tom02 = run.getBean("tom", Pet.class);

    System.out.println("组件:"+(tom01 == tom02));
    //4、com.atguigu.boot.config.MyConfig$$EnhancerBySpringCGLIB$$51f1e1ca@1654a892
    MyConfig bean = run.getBean(MyConfig.class);
    System.out.println(bean);

    //如果@Configuration(proxyBeanMethods = true)代理对象调用方法。SpringBoot总会检查这个组件是否在容器中有。
    //保持组件单实例
    User user = bean.user01();
    User user1 = bean.user01();
    System.out.println(user == user1);
    User user01 = run.getBean("user01", User.class);
    Pet tom = run.getBean("tom", Pet.class);

    System.out.println("用户的宠物:"+(user01.getPet() == tom));
    }
   }

标签:run,Pet,User,AOP,组件,注解,Configuration,class,user01
来源: https://blog.csdn.net/wyffeige/article/details/115698486

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有