代码在:
-----------------------------------------------------------------------------------------------------------------------------------
11.FactoryBean。
applicationCoontext就是一个容器罢了:
代码:
代码:
//创建一个Spring定义的FactoryBean
public class ColorFactoryBean implements FactoryBean<Color> {
//返回一个Color对象,这个对象会添加到容器中
@Override
public Color getObject() throws Exception {
// TODO Auto-generated method stub
System.out.println("ColorFactoryBean...getObject...");
return new Color();
}
@Override
public Class<?> getObjectType() {
// TODO Auto-generated method stub
return Color.class;
}
//是单例?
//true:这个bean是单实例,在容器中保存一份
//false:多实例,每次获取都会创建一个新的bean;
@Override
public boolean isSingleton() {
// TODO Auto-generated method stub
return false;
}
}
在MainConfig2配置文件加入:
@Bean
public ColorFactoryBean colorFactoryBean(){
return new ColorFactoryBean();
}
调用:
//工厂Bean获取的是调用getObject创建的对象
Object bean2 = applicationContext.getBean("colorFactoryBean");
Object bean3 = applicationContext.getBean("colorFactoryBean");
System.out.println("bean的类型:"+bean2.getClass());// 获取的是调用getObject方法创建的对象
System.out.println(bean2 == bean3);
Object bean4 = applicationContext.getBean("&colorFactoryBean");// 获取的是Factorybean
System.out.println(bean4.getClass());
------------------------------------------------------11-------------------------------------------------------------
12.bean的生命周期
@Configuration和@Bean:https://blog.csdn.net/liuyinfei_java/article/details/82011805
1.构造器方法:是容器启动时候创建的
2.初始化方法:初始化完毕就调用init
3.销毁方法:容器关闭调用destory
-----------------------
多例的话获取才初始化init,但是不会销毁就是不会自动管理。
代码:
Bean生命周期,实例化,属性赋值,初始化,销毁。
@Component
public class Car {
public Car(){
System.out.println("car constructor...");
}
public void init(){
System.out.println("car ... init...");
}
public void detory(){
System.out.println("car ... detory...");
}
}
@ComponentScan("com.atguigu.bean")
@Configuration
public class MainConfigOfLifeCycle {
//@Scope("prototype")
@Bean(initMethod="init",destroyMethod="detory")
public Car car(){
return new Car();
}
}
public class IOCTest_LifeCycle {
@Test
public void test01(){
//1、创建ioc容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
System.out.println("容器创建完成...");
//applicationContext.getBean("car");
//关闭容器
applicationContext.close();
}
}
------------------------------------------------------12-------------------------------------------------------------
13.initializing和DisposableBean
第二种方法:
在beanFactory设置完所有bean之后属性赋值之后进行调用的,调用这个方法。
实现:
代码:
@Component
public class Cat implements InitializingBean,DisposableBean {
public Cat(){
System.out.println("cat constructor...");
}
@Override
public void destroy() throws Exception {
// TODO Auto-generated method stub
System.out.println("cat...destroy...");
}
@Override
public void afterPropertiesSet() throws Exception {
// TODO Auto-generated method stub
System.out.println("cat...afterPropertiesSet...");
}
}
@ComponentScan("com.atguigu.bean")
@Configuration
public class MainConfigOfLifeCycle {
//@Scope("prototype")
@Bean(initMethod="init",destroyMethod="detory")
public Car car(){
return new Car();
}
}
public class IOCTest_LifeCycle {
@Test
public void test01(){
//1、创建ioc容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
System.out.println("容器创建完成...");
//applicationContext.getBean("car");
//关闭容器
applicationContext.close();
}
}
------------------------------------------------------13-------------------------------------------------------------
14.@PostConstruct和@PreDestory
第三种方法也是Bean创建完成并且属性值赋值完成:
在加载之后
在移除之前
总结:https://www.bbsmax.com/A/Gkz17VYN5R/
代码:
@Component
public class Dog implements ApplicationContextAware {
//@Autowired
private ApplicationContext applicationContext;
public Dog(){
System.out.println("dog constructor...");
}
//对象创建并赋值之后调用
@PostConstruct
public void init(){
System.out.println("Dog....@PostConstruct...");
}
//容器移除对象之前
@PreDestroy
public void detory(){
System.out.println("Dog....@PreDestroy...");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
// TODO Auto-generated method stub
this.applicationContext = applicationContext;
}
}
------------------------------------------------------14-------------------------------------------------------------
15.BeanPostProcesser
后置处理器
代码:
@Component
public class MyBeanPsotProcesser implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("post before"+ beanName);
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("post after" + beanName);
return bean;
}
}
代码:
在所有的初始化方法之前和之后调用的。
测试结果:
------------------------------------------------------15-------------------------------------------------------------
BeanPostProcesser的原理:
ApplicationRunner:https://blog.csdn.net/jdd92/article/details/81053404
1.创建ioc容器:
2.在构造方法里面:
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
this();
register(annotatedClasses);
refresh();
}
走refresh方法。
3.进入这个方法
4.applicationContext调用的beanFactory
// Instantiate all remaining (non-lazy-init) singletons.
beanFactory.preInstantiateSingletons();
初始化所有的单实例的bean。
5.doGetBean方法:createBean,doCreateBean。
6.创建对象
初始化是在属性赋值之后的。
populateBean就是先给属性赋值好。
然后进入initializeBean。
进入这个方法:
执行初始化方法。
总结:
进入:
这里遍历所有的beanProcesser。一旦返回null直接跳出for循环。
Bean的生命周期:https://www.jb51.net/article/154487.htm
------------------------------------------------------16-------------------------------------------------------------
spring底层:
帮我们的租价注入IOC容器,想要什么就是Aware之前是什么。
例子1:这个就是通过后置处理器处理的。
public class Dog implements ApplicationContextAware {
private ApplicationContext applicationContext;
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
源码:
例子2:校验Bean。
例子3:@PostContust注解等
利用反射。
例子4:
总结:
-------------------------------------------------------------------17---------------------------------------------------------------
IOC面试题:https://blog.csdn.net/a745233700/article/details/80959716
-------------------------------------------------------------------26---------------------------------------------------------------------