Spring IOC/ AOP 笔记
以下主要是使用基于注解方式配置
组件扫描(一般用于自己写的类)
添加 @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" />