@Configuration
声明在类上面,表示把这个类作为IoC容器
@ComponentScan
声明在启动类上,该注解默认会扫描该类所在包及所有子类包中所有配置类,或手动在参数中添加扫描路径
@Scope
指定bean作用域,应用于方法上,默认是单例:prototype:原型,多例;singleton:单例;request:主要用于web模块,同一次请求只创建一个实例;session:主要应用于web模块,同一个session只创建一个对象
@Lazy
表示延迟初始化,调用getBean时才创建对象,bean默认非延迟
@Conditional
Spring4开始提供的。作用是根据条件进行判断满足条件才注册bean;在bean上添加@Conditional注解,参数里写自己实现的判断类名.class,创建判断类,实现Condition接口,实现matches方法,返回true代表加载bean。
事例根据操作系统判断是否加载bean
@Import
导入外部资源(手动加载第三方资源到ioc容器中 ),直接在方法参数中添加需要加入的class就可以了
自定义规则,实现ImportSelector接口,实现selectImports方法
实现ImportBeanDefinitionRegitrar接口,实现reciterBeanDefinitions接口直接把对象塞到ioc中
且当类存在时才加载,不存在时不加载也不报错
实现FactoryBean加载到IOC
Bean的初始化及销毁自定义
- 使用注解
@PostContruct用于指定初始化方法
@PreDestory用于指定销毁方法
@DependsOn定义bean初始化及销毁时顺序 - 实现InitializingBean,DisposableBean来实现初始化bean及销毁方法
- 实现BeanPostProcessor接口,覆盖接口中的两个方法
通用注解
详细:
@value的写法
@PropertySource写法
@Qualifier
Qualifier的意思是合格者,通过这个标示,表明了哪个实现类才是我们所需要的;
扩展:@Qualifier加在注解上
上面的例子中,可以看到是使用@Qualifier()中value的参数来筛选bean的,给此参数起个名字,叫做修饰语。修饰语是字符串类型,可以设置各种值。
如果一个工程的修饰语种类特别多,或者修饰语语义之间有继承等类似复杂关系,或者需要用多个修饰语修饰同一个bean,那用这种直接的方式就不太好操作了。修饰语value字符串容易拼错,容易混淆,更不容易被编辑器检测出来,调试bug困难。
因此可以自定义一个新的注解,使用@Qualifier修饰,制作自己的修饰语注解
@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier("Asian") //使用@Qualifier自定义修饰注解Asian
public @interface Asian{ ... }
···············
//定义亚洲人
@Asian //使用我们自定义的修饰注解
@Component
public class AsianMan extends Person {
}
注入
public class Controller {
@Asian //指定注入的是Asain的bean
@Autowired
private Person person;
}
这种自定义注解数量不受限,便于统一管理,编辑器还能识别,因此推荐用这种方法来完成修饰与指定注入。
@Primary 在一个接口类有多个实现时,在类上添加这个注解,注入时首先注入添加该注解的类,如果不添加,通过类获取bean时会报错
@ReSource 通过名字注入bean,和@Autowired配合使用
织入组件
ApplicationContextAware
可以通过这个上下文环境对象得到spring容器中的bean
BeanDefinitionRegistryPostProcessor