- IOC 控制反转 由容器控制资源的创建,获取,销毁操作,不需要自己创建对象
- DI 依赖注入 检查组件的依赖关系,通过setter方法,构造器等方式自动注入
自动注入
- @Bean 在配置类中注入一个对象
- @Configuration 标记一个类为配置类
- @Controller @Service @Component @Repository
- @ComponentScan 包扫描
- @Import 将指定的类导入容器中
- @Scope 调整组件的作用域 默认是单实例
- prototype 非单实例
- 容器启动时并不会创建非单例实例,只有获取的时候才会创建
- singleton 单实例
- request 同一个请求单实例
- session 同一个session单实例
- @Lazy 单实例情况下懒加载 只有第一次用到时对象才会被创建
- 自己新建类实现FactoryBean接口向容器中添加对象 一般用来构造复杂对象
public class MyFactory implements FactoryBean<Account> {
@Override
public Account getObject() throws Exception {
return new Account();
}
@Override
public Class<?> getObjectType() {
return Account.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
- @Conditional 条件判断 有一大堆变种
- @Autowired 自动注入
- 成员变量 先根据成员变量的类型寻找,如果找到多个,根据变量名称寻找
- setter注入
- @Qualifier 用在@Autowired之上 根据指定name去寻找组件
- @Resource 与Autowired功能相同
- 只不过是不同的包 Autowired只能在spring框架中使用,@Resource可以在任何java容器中使用,更加通用
- @Resource现根据名称查找再根据类型查找,@Autowired先根据类型查找再根据名称过滤
- 构造器注入
- 可以不标注Autowired 框架会自动把构造器所需的参数自动注入
- @Value #{}配合spel表达式给属性赋值,${cat.name:默认值}取配置文件的属性给变量赋值
- @PropertiesSource(classpath:xxx.properties) 加载一个文件作为配置文件 例如 xxxxx.properties
- @ConfigurationProperties 指定一个前缀,将配置类中带有这个前缀的配置赋值给成员变量
- @Profile 多环境 配合配置文件的spring.profiles.active=环境名 使用
Bean的生命周期
- @Bean注解可以指定init和destroy方法
- @PostConstruct 在调用构造器之后执行
- @Predestroy 在销毁前调用
- initializingBean接口 也是在构造器方法执行,@Autowire自动注入之后执行,不过在@Bean指定的init方法前执行
- DisposableBean接口 在Bean指定的destroy方法前执行
- BeanPostProcessor接口(一般用不到)
- Autowire注解就是使用这个接口实现的
- 一些自定义注解也是使用这个接口+反射实现
- 自己补充一个图.jpg
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(
Object bean, String beanName) throws BeansException {
// 在初始化init方法执行前调用
if (beanName.equals("dog") || bean instanceof Dog){
System.out.println("dog initial前被拦截");
}
return BeanPostProcessor.super.
postProcessBeforeInitialization(bean, beanName);
}
@Override
public Object postProcessAfterInitialization(Object bean,
String beanName) throws BeansException {
// 在初始化方法执行之后调用
if (beanName.equals("dog") || bean instanceof Dog){
System.out.println("dog initial后被拦截");
}
return BeanPostProcessor.super.
postProcessAfterInitialization(bean, beanName);
}
}