Spring IOC/ AOP 笔记
扫描 Bean
以下主要是使用基于注解方式配置
组件扫描(一般用于自己写的类)
添加 @Component 注解,被扫描到后自动作为 Bean 组件
@ComponentScan 扫描配置的位置,将添加了@Component 注解的类装配为 Bean
默认扫描和此注解所在的包中
如果要扫描特定的包,添加属性
(basePackages="cc" 或 {"dd","dd1"})
,如果不想使用字符串,可以使用
(basePackageClasses = {xx.class, aa.class})
,这样这些类所在的包将作为组件扫描的基础包
多个(种)配置文件互相引用
JavaConfig 互相引用:
@Import({aa.class, bb.class})
JavaConfig 引用 xml 配置:
@ImportResource()
xml 互相引用:
<import resource="" />
xml 引用 JavaConfig:
<bean class="aa.BbConfig" />
显示配置(一般用于第三方的类)
@Bean,默认 id 为方法名,显示指定使用 (name = "")
Bean 间引用
在 @Bean 对应的方法中直接调用另一个 @Bean 的方法
在 @Bean 方法的参数中添加需要的类,Spring 会自动注入
自动装配的歧义性
首选Bean 添加
@Primary
注入处 使用限定符
@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 支持:
基于代理的经典 Spring AOP
纯 POJO 切面
@AspectJ 注解驱动的切面
注入式 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" />
最新文章
- iOS可视化动态绘制连通图
- DHTML概述
- Linux线程-pthread_kill
- iOS开发之--NSPredicate
- 使用自定义《UIActivity》进行内容分享-b
- 25045操作标准子程序集41.C
- 新版SDK自己主动加入PlaceholderFragment的思考
- 数据结构:Binary and other trees(数据结构,算法及应用(C++叙事描述语言)文章8章)
- java代理的深入浅出(一)-Proxy
- 解决UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe5 in position 108: ordinal not in range(128
- [Machine Learning] 深度学习中消失的梯度
- 爬虫入门系列(三):用 requests 构建知乎 API
- Node.js初探之GET方式传输
- TensorFlow之DNN(二):全连接神经网络的加速技巧(Xavier初始化、Adam、Batch Norm、学习率衰减与梯度截断)
- struts2_struts2基本配置
- Linux_x86下NX与ASLR绕过技术
- MSSQL 2012 密钥
- html5 js实现浏览器全屏
- Oracle 存储过程发送邮件
- 浅谈User Information List
热门文章
- webstorm破解 2020 最新更新
- 【vue】---- v-model在自定义组件中的使用
- Docker 使用杂记 - 最佳实践尝试 - 实战
- MySQL 【常识与进阶】
- Vue2.0 【第二季】第2节 Vue.extend构造器的延伸
- abp(net core)+easyui+efcore实现仓储管理系统——入库管理之四(四十)
- vue依赖注入
- 【Python】2.11学习笔记 注释,print,input,数据类型,标识符
- 初始Django—Hello world
- nmap端口扫描工具安装和使用方法