zoukankan      html  css  js  c++  java
  • Spring IOC/ AOP 笔记

    扫描 Bean

    以下主要是使用基于注解方式配置

    组件扫描(一般用于自己写的类)

    添加 @Component 注解,被扫描到后自动作为 Bean 组件

    @ComponentScan 扫描配置的位置,将添加了@Component 注解的类装配为 Bean

    1. 默认扫描和此注解所在的包中

    2. 如果要扫描特定的包,添加属性(basePackages="cc" 或 {"dd","dd1"})

    3. 如果不想使用字符串,可以使用(basePackageClasses = {xx.class, aa.class}),这样这些类所在的包将作为组件扫描的基础包

    多个(种)配置文件互相引用

    1. JavaConfig 互相引用:@Import({aa.class, bb.class})

    2. JavaConfig 引用 xml 配置:@ImportResource()

    3. xml 互相引用: <import resource="" />

    4. xml 引用 JavaConfig:<bean class="aa.BbConfig" />

    显示配置(一般用于第三方的类)

    @Bean,默认 id 为方法名,显示指定使用 (name = "")

    Bean 间引用

    1. 在 @Bean 对应的方法中直接调用另一个 @Bean 的方法

    2. 在 @Bean 方法的参数中添加需要的类,Spring 会自动注入

    自动装配的歧义性

    1. 首选Bean 添加@Primary

    2. 注入处 使用限定符 @Qualifier("<选择的Bean id>")

    Bean 的作用域

    • 单例(Singleton): 在整个应用中,只创建 Bean 的一个例

    • 原型(Prototype): 每次注入时,都会创建一个新的 Bean 实例

    • 会话(Session): 在 Web 应用中,为每个会话创建一个 Bean 实例

    • 请求(Request): 在 Web 应用中,为每个请求创建一个 Bean 实例

    使用时在 Bean 上添加对应注解

    单例: @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)

    原型: @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

    会话: @Scope(WebApplicationContext.SCOPE_SESSION)

    请求: @Scope(WebApplicationContext.SCOPE_REQUEST)

    如果使用会话或者请求作用域,那么当其应用(注入)到单例 Bean 时,需要配置代理

    如果配置会话或请求作用域的 Bean 是一个接口,那么@Scope(value=WebApplicationContext.SCOPT_SESSION, proxyMode=ScopedProxyMode.INTERFACES);如果是一个类,那么需要将 proxyMode 改为ScopedProxyMode.TARGET_CLASS

    注入配置文件中的值

    @Configuration
    @PropertySource("classpath:app.properties")
    public class ExpressiveConfig {
        @Autowired
        Environment env;
        
        @Bean
        public BlankDisc disc() {
            return new BlankDisc(env.getProperty("dict.title"));
        }
    }

    AOP

    Spring 切面可以应用 5 种类型的通知:

    • 前置通知 (Before)

    • 后置通知 (After)

    • 返回通知 (After-returning) : 成功执行后调用

    • 异常通知 (After-throwing)

    • 环绕通知 (Around)

    Spring 提供了 4 种类型的 AOP 支持:

    1. 基于代理的经典 Spring AOP

    2. 纯 POJO 切面

    3. @AspectJ 注解驱动的切面

    4. 注入式 AspectJ 切面(适用于 Spring 各版本)

    @Aspect
    @Component // 注册为 Bean
    public class Audience {
        @Before("execution(** concert.Performance.perform(..))")
        public void silenceCellPhones() {
            // silenceCellPhones
        }
      
        @Before("execution(** concert.Performance.perform(..))")
        public void takeSeats() {
            // takeSeats
        }
    }

    对于相同的切点,可以在一处定义,结果如下

    @Aspect
    @Component // 注册为 Bean
    public class Audience {
        @Pointcut("execution(** concert.Performance.perform(..))")
        pulbic void performance() {}
      
        @Before("performance()")
        public void silenceCellPhones() {
            // silenceCellPhones
        }
      
        @Before("performance()")
        public void takeSeats() {
            // takeSeats
        }
    }

    JavaConfig 配置

    @Configuration
    @EnableAspectJAutoProxy // 启用 AspectJ 自动代理
    @ComponentScan
    public class AopConfig {
        
    }

    对于 xml 配置为:

    <aop:aspectj-autoproxy proxy-target-class="true" />

     

  • 相关阅读:
    对Postmaster 对 SIGQUIT 信号处理的理解
    kill bgwriter 的小实验
    我对 execl 的学习
    pid_t 数据类型
    我对bgwriter.c 与 guc 关系的初步理解
    对Linux 下 SIGUSR1 与 SIGUSR2 的理解
    向bgwriter 发送 SIGQUIT 的实验
    常用txt图标符号
    也做网页图标favicon.ico
    TakeColor颜色拾取工具
  • 原文地址:https://www.cnblogs.com/zawier/p/7287763.html
Copyright © 2011-2022 走看看