Spring通过DI(依赖注入)实现IOC(控制反转)
spring的两种注入方式
构造方法注入
setter方法注入
注解注入是通过反射 feild.set ≈ setter
spring的四种注入模型
注入模型:找Bean和设置Bean
- no ---默认无自动装配,Bean引用必须由ref元素定义。
- byType ---按照该属性类型装配。
- byName ---按照名字装配,Spring寻找与需要自动装配的属性同名的bean。
- constructor ---推断构造方法,通过构造方法的参数去装配。
@Autowired和@Resource
@Autowired ---spring提供,并不是自动注入而是手动注入,会现根据type去找,如果找不到会根据name去找。
@Resource ---jdk提供,先根据name找,后根据type找,name是@comppent名字。
注:此处type和name与xml里byType和byName不同
单例和原型
单例的bean实例是唯一的,取hashcode是同一个
原型的bean实例是多个
@Scope("prototype")
原型
通过注入ApplicationContext方式:
@Autowired
private ApplicationContext applicationContext;
public void test(){
//此时每次拿到的bean都是新的
applicationContext.getBean(xxx.class);
}
通过@Lookup:
@Component
public abstract class TestService {
@Lookup
public abstract Test2Service test();
public void test2(){
Test2Service test2Service = test();
test2Service.hashCode()
}
}
spring初始化方法
有三种方式
如果配置多个同一机制则只会执行一次
顺序:
注解方式@PostConstruct
实现InitializingBean
按xml里 init-method = "xxx"
顺序是spring的生命周期来的,
源码里是先取到一个后置处理器去处理注解,
然后执行init方法去依次调用接口方法和xml方法
容器的生命周期
Lifecycle
实现 SmartLifecycle
使用SmartLifecycle要把isAutoStartup()方法改为return ture;
容器停止时会调用stop(Runnable callback)
然后默认会等30秒停止容器,可以用callback.run()立即停止
@DependsOn("xxxService") 可以指定某个Service在此service之前加载
@Lazy(true) 懒加载 会在getBean的时候才会加载,然后放入单例中下次不用再加载