Spring
Spring容器的使用
依赖注入
注入:就相当于把某个对象通过依赖注入变成另一个对象的属性。
属性注入
在当前类被Spring扫描,可以在属性上添加@Autowired注解,会将容器中的Bean对象装配进来(也就是两个Bean对象建立关系,并不会重新注册对象)。如:
@Repository
public class LoginRepository {
}
@Service
public class LoginService {
@Autowired
private LoginRepository loginRepository;
}
此时,容器中LoginRepository类型的对象也只有一个,这个对象是LoginService类型对象的属性。 也可以把属性写为private,在setter方法上添加@Autowired注解
@Controller
public class LoginController {
private LoginService loginService;
@Autowired
public void setLoginService(LoginService loginService) {
this.loginService = loginService;
}
}
构造方法注入
构造方法上的参数,会从容器中获取到该类型的对象
@Service
public class LoginService {
public LoginRepository loginRepository;
@Autowired
public LoginService(LoginRepository loginRepository) {
this.loginRepository = loginRepository;
}
}
注入指定的Bean
如果一个类型的Bean注册了多个对象,要注入时,就需要使用@Qualifier(“Bean的名称”)来指定(如果不指定,就会出现不知道应该注入该类型的哪个对象,就会报错)
Bean的作用域
设置Bean的作用域时,应该在类前添加注解@Scope(“关键词”),如:@Scope(“prototype”)
singleton
该作用域下的Bean在容器中只存在一个实例,获取Bean和注入Bean都是同一个对象(默认方式)
prototype
每次对该作用于下的Bean的请求都会产生一个新的对象,获取Bean和注入Bean都是新的对象(即获取对象1 !=获取对象2)
request
每次Http请求都会创建新的对象,类似于prototype。在一次Http请求里共享Bean实例
session
在一个Http Session中,定义一个Bean实例。用户的会话共享Bean实例(如:一个用户的登录信息)
Bean的生命周期
对于Bean的生命周期,主要步骤为:
实例化Bean:通过类对象的反射调用构造方法实例化对象(class对象.newInstance来生成实例对象)
依赖注入:装配Bean的属性
Aware接口方法:实现了Aware接口,执行接口方法。如顺序执行:BeanNameAware、BeanFactoryAware、ApplicationContextAware的接口方法
BeanPostProcessor预初始化方法:Bean对象初始化之前,循环调用实现了BeanPostProcessor接口的预初始化方法(postProcessorBeforeInitalization)
Bean对象初始化:顺序执行@PostConstruct注解方法,InitializingBean接口方法,Init-method方法
BeanPostProcessor后初始化方法:Bean对象初始化后,循环调用实现了BeanPostProcessor接口的后初始化方法(postProcessorAfterInitalization)
容器关闭:关闭时,执行Bean对象的销毁方法,顺序是:@PreDestory注解方法、DisposableBean接口方法、destory-method
补充
@Bean 注解的方法上如果有参数,也会从容器中获取参数类型的对象。
|