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

 

最新文章

  1. iOS可视化动态绘制连通图
  2. DHTML概述
  3. Linux线程-pthread_kill
  4. iOS开发之--NSPredicate
  5. 使用自定义《UIActivity》进行内容分享-b
  6. 25045操作标准子程序集41.C
  7. 新版SDK自己主动加入PlaceholderFragment的思考
  8. 数据结构:Binary and other trees(数据结构,算法及应用(C++叙事描述语言)文章8章)
  9. java代理的深入浅出(一)-Proxy
  10. 解决UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe5 in position 108: ordinal not in range(128
  11. [Machine Learning] 深度学习中消失的梯度
  12. 爬虫入门系列(三):用 requests 构建知乎 API
  13. Node.js初探之GET方式传输
  14. TensorFlow之DNN(二):全连接神经网络的加速技巧(Xavier初始化、Adam、Batch Norm、学习率衰减与梯度截断)
  15. struts2_struts2基本配置
  16. Linux_x86下NX与ASLR绕过技术
  17. MSSQL 2012 密钥
  18. html5 js实现浏览器全屏
  19. Oracle 存储过程发送邮件
  20. 浅谈User Information List

热门文章

  1. webstorm破解 2020 最新更新
  2. 【vue】---- v-model在自定义组件中的使用
  3. Docker 使用杂记 - 最佳实践尝试 - 实战
  4. MySQL 【常识与进阶】
  5. Vue2.0 【第二季】第2节 Vue.extend构造器的延伸
  6. abp(net core)+easyui+efcore实现仓储管理系统——入库管理之四(四十)
  7. vue依赖注入
  8. 【Python】2.11学习笔记 注释,print,input,数据类型,标识符
  9. 初始Django—Hello world
  10. nmap端口扫描工具安装和使用方法