扫描 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" />

 

Spring IOC/ AOP 笔记的更多相关文章

  1. spring ioc aop 原理

    spring ioc aop 原理 spring ioc aop 的原理 spring的IoC容器是spring的核心,spring AOP是spring框架的重要组成部分. 在传统的程序设计中,当调 ...

  2. Spring IOC AOP的原理 如果让你自己设计IOC,AOP如何处理(百度)

    百度的面试官问,如果让你自己设计一个IOC,和AOP,如何设计, 我把IOC的过程答出来了,但是明显不对, (1) IOC 利用了反射,自己有个id,classtype,hashmap,所有的功能都在 ...

  3. Spring IOC + AOP 的实现

    Spring思想很不错,尽量减少侵入式编程.现在了解到的Spring提供的功能有,DI,IOC,数据库操作,AOP,MVC.针对DI,AOP写了一些小DEMO PS:AOP真的很棒 代码参考:< ...

  4. spring Ioc Aop整合

    之前用DWP项目做spring的IOC,xml总是提示有问题,之后改用maven通过. 之后将这一块的内容补充. 仔细考虑一下spring 的IOC是无处不在的,演示Aop也需要依赖spring的IO ...

  5. spring ioc aop 理解

    OC,依赖倒置的意思,所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B.所谓倒置,你必须理解如果不倒置,会怎么着,因为A必须要有B,才可以调用B,如果 ...

  6. spring IOC DI AOP MVC 事务, mybatis 源码解读

    demo https://gitee.com/easybao/aop.git spring DI运行时序 AbstractApplicationContext类的 refresh()方法 1: pre ...

  7. Spring学习笔记(二)Spring基础AOP、IOC

    Spring AOP 1. 代理模式 1.1. 静态代理 程序中经常需要为某些动作或事件作下记录,以便在事后检测或作为排错的依据,先看一个简单的例子: import java.util.logging ...

  8. [原创]java WEB学习笔记105:Spring学习---AOP介绍,相关概念,使用AOP,利用 方法签名 编写 AspectJ 切入点表达式

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. 对于Spring中AOP,DI,IoC概念的理解

    IOC IoC(inversion of Control),控制反转.就好像敏捷开发和SCRUM一样,不是什么技术,而是一种方法论,一种工程化的思想.使用IoC的思想意味着你将设计好的对象交给容器控制 ...

随机推荐

  1. codeigniter框架的使用感受和注意事项

    codeigniter是一个轻量级的php的web框架,今年2月22日,正式发布了4.0版本.简称CI框架 先使用了CI的3.15版,基本上是不用安装,把框架文件放到web目录下,让后通过简单的配置, ...

  2. Go语言转义字符

    \a 匹配响铃符 (相当于 \x07) 注意:正则表达式中不能使用 \b 匹配退格符,因为 \b 被用来匹配单词边界, 可以使用 \x08 表示退格符. \f 匹配换页符 (相当于 \x0C) \t ...

  3. JVM01——JVM内存区域的构成

    从本文开始将为各位带来JVM方面的知识点,关注我的公众号「Java面典」了解更多Java相关知识点. JVM内存主要分为三部分线程私有(Thread Local).线程共享(Thread Shared ...

  4. Django _web框架本质

    Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. socket服务端 import  ...

  5. Vue2.0 【第一季】第1节 走进我的Vue2.0

    目录 Vue2.0 [第一季]内部指令 第一节 走进我的Vue2.0 Vue2.0 [第一季]内部指令 记录一下我的代码地址:D:/Code/Vue 编辑器:VS code 前置知识: 1.HTML的 ...

  6. python基础学习day02

    pycharm的安装以及简单使用 辅助开发软件,代码逐行调试,设计高端 python的种类: ​ CPython:官方推荐可以转换成c能够识别的字节码. ​ JPython:可以转化为Java语言能够 ...

  7. Spring Cloud 系列之 Netflix Hystrix 服务监控

    Actuator Hystrix 除了可以实现服务容错之外,还提供了近乎实时的监控功能,将服务执行结果和运行指标,请求数量成功数量等等这些状态通过 Actuator 进行收集,然后访问 /actuat ...

  8. Model、Form、ModelForm的比较

    Model.Form.ModelForm 本节内容: 1:Model 2:Form 3:Model Form 1 2 3 http://www.cnblogs.com/wupeiqi/articles ...

  9. C 2013笔试题

    1.把整数分解成素数 如90=2*3*3*5 [见2015年] 方法一: int main() { int n, i=2; printf("\nInput:"); scanf(&q ...

  10. CF1327D Infinite Path 题解

    原题链接 太坑了我谔谔 简要题意: 求一个排列的多少次幂能达到另一个排列.排列的幂定义见题.(其实不是新定义的,本来就是这么乘的) 很显然,这不像快速幂那样可以结合律. 既然这样,就从图入手. 将 \ ...