扫描 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. CSS 文本截断方案

    单行截断 .ellipsis { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } 此方法兼容到ie6过.不过只能单行 ...

  2. 初识JVM:(一)JVM工作原理和流程

    本文主要参考:http://blog.csdn.net/CSDN_980979768/article/details/47281037?locationNum=7&fps=1 声明:主要用于个 ...

  3. H5页面,输入框的光标,如果页面上下滑动光标停留在页面上,除了输入框外,松手过了一段时间才跑回输入框里面

    有点类似这种情况 其中一个博主描述得比较详细,主要还有图 我是直接在App.vue主文件那里添加一下代码,主要是添加一个监听器,如果touchmove的时候就会触发让其失焦,就会消失那个光标,需要再次 ...

  4. 建议13:禁用Function构造函数

    定义函数的方法包括3种:function语句,Function构造函数和函数直接量.不管用哪种方法定义函数,它们都是Function对象的实例,并将继承Function对象所有默认或自定义的方法和属性 ...

  5. 浅谈ASP.NET Core中的DI

    DI的一些事 传送门马丁大叔的文章 什么是依赖注入(DI: Dependency Injection)?     依赖注入(DI)是一种面向对象的软件设计模式,主要是帮助开发人员开发出松耦合的应用程序 ...

  6. C++之 ostream详细用法

    前言 在 C++中,ostream表示输出流,英文”output stream“的简称.在 C++中常见的输出流对象就是标准输出流cout,很少自定义ostream的对象,更多的是直接使用cout.那 ...

  7. uni-app 遮罩模板

    1. common新建mask.vue文件. <template> <view> <view class="cpt-mask"> </vi ...

  8. python多重继承的属性和方法调用顺序问题和对迭代器的初步理解

    推荐阅读:https://www.cnblogs.com/bigb/p/11650707.html 计算机学习的一个好办法就是自己将代码跑一遍,了解代码的运作顺序和原理(主要弄懂 函数作用,传入参数, ...

  9. SpringMVC框架——转发与重定向

    网上摘取一段大神总结的转发与重定向的区别,如下: 转发(服务端行为) 形式:request.getRequestDispatcher().forward(request,response) 转发在服务 ...

  10. Proteomic Profiling of Paired Interstitial Fluids Reveals Dysregulated Pathways and Salivary NID1 as a Biomarker of Oral Cavity Squamous Cell Carcinoma (解读人:张聪敏)

    文献名:Proteomic Profiling of Paired Interstitial Fluids Reveals Dysregulated Pathways and Salivary NID ...