扫描 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. Redis系列二 - 数据结构

    前言 redis作为我们开发的一大神器,我们接触肯定不会少,但是很多同学也许只会存储String类型的值,这是非常不合理的.在这里,将带大家认识Redis的5中数据结构. 1.问:Redis有那些数据 ...

  2. 内网渗透之信息收集-Linux系统篇

    linux 系统信息 grep MenTotal /proc/meminfo #查看系统内存总量 cat /etc/issue #查看系统名称 cat /etc/lsb-release #查看系统名称 ...

  3. 简述N种排序算法

    排序算法概述 排序算法是程序员日常很常见的算法,基本上每天都会使用排序,在这里将进行一下总结. 排序算法大致可分为比较类排序和非比较类排序二种,其核心区别可以简单的理解为非比较类排序是对比较类排序之前 ...

  4. 建议8:恰当选用if和switch

    相对来说下面几种情况更适合switch结构 枚举表达式的值.这种枚举是可以期望的,平行逻辑关系的 表达式的值具有离散性,不具有线性的非连续的区间值 表达式的值是固定的,不是动态变化的 表达式的值是有限 ...

  5. Java对接百度智能云人脸识别

    ------------------------->这篇文章就是自己做个笔记<------------------------- 首先登录or注册自己的百度智能云管理中心:https:// ...

  6. 视频 embed标签动态改变Src的值,局部刷新播放其他视频的javascript方法

    看图: 视频处html代码: <div id="mod_player" class="mod_player"> <embed id=" ...

  7. Python生态_turtle库

    Python生态_turtle库: 绘制状态函数: pendown():别名pd(),落下画笔,之后,移动画笔将绘制形状 penup():抬起画笔 pensize():画笔粗细大小 颜色控制函数: p ...

  8. 文件上传transferTo一行代码的bug

    本次的项目环境为 Running with Spring Boot v1.5.10.RELEASE, Spring v4.3.14.RELEASE, 服务器环境为CentOS7.0. transfer ...

  9. 给 ABP vNext 应用安装私信模块

    在上一节五分钟完成 ABP vNext 通讯录 App 开发 中,我们用完成了通讯录 App 的基础开发. 这本章节,我们会给通讯录 App 安装私信模块,使不同用户能够通过相互发送消息,并接收新私信 ...

  10. Natas18 Writeup(Session登录,暴力破解)

    Natas18: 一个登录界面,查看源码,发现没有连接数据库,使用Session登录,且$maxid设定了不大的上限,选择采取爆破. 源码解析: <html> <head> & ...