spring-atguigu-IOC---11

代码在:

-----------------------------------------------------------------------------------------------------------------------------------

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循环。

spring通过反射创建bean:https://blog.csdn.net/qq_41908550/article/details/86528794?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

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---------------------------------------------------------------

小结:https://www.bbsmax.co

IOC面试题:https://blog.csdn.net/a745233700/article/details/80959716

-------------------------------------------------------------------26---------------------------------------------------------------------

发布了374 篇原创文章 · 获赞 12 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_28764557/article/details/104735985