JavaEE初学02
- Spring
- Spring容器的使用
- FactoryBean
- FactoryBean的使用方法
- 依赖注入
- 属性注入
- 构造方法注入
- Bean注入
- 注入指定的Bean
- Bean的作用域
- singleton
- prototype
- request
- session
- Bean的生命周期
- 补充
Spring
Spring容器的使用
FactoryBean
BeanFactory 是Spring容器的顶级接口
而 FactoryBean 是工厂Bean,其本身是一个Bean,且主要是生产工厂的Bean
public interface FactoryBean<T>{
//返回对象实例
T getObject() throws Exception;
//Bean的类型
Class<?> getObjectType();
//是否是单例的Bean对象,不实现该接口方法默认为单例
default boolean isSingleton(){
return true;
}
}
FactoryBean的使用方法
@Component
public class FactoryBeanDemo implements FactoryBean {
@Override
public DemoBean getObject() throws Exception {
DemoBean demoBean = new DemoBean();
demoBean.setName("litlit");
demoBean.setAge(99);
return demoBean;
}
@Override
public Class<?> getObjectType() {
return DemoBean.class;
}
}
通过FactoryBeanDemo来获取的Bean的类型为DemoBean,要获取到FactoryBeanDemo类型的Bean就需要通过&factoryBeanDemo
来进行获取。获取如下:
public class App {
public static void main(String[] args) {
//根据Spring配置文件路径创建容器:应用上下文对象
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
DemoBean d3 = (DemoBean) context.getBean("factoryBeanDemo");
FactoryBeanDemo f1 = (FactoryBeanDemo) context.getBean("&factoryBeanDemo");
System.out.println(d3);
System.out.println(f1);
//关闭容器
((ClassPathXmlApplicationContext) context).close();
}
}
依赖注入
注入:就相当于把某个对象通过依赖注入变成另一个对象的属性。(把一个Bean注入到另一个Bean中,前者成为后者的属性。直接获取前者和通过后者的属性来获取前者,两者获取的对象为同一个。)
属性注入
在当前类被Spring扫描,可以在属性上添加@Autowired 或 @Resource注解,会将容器中的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注解的方法上,也会将容器中的Bean对象注入到方法参数上。(等同于@Autowired)
注入指定的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 注解的方法上如果有参数,也会从容器中获取参数类型的对象。