Spring的核心是IOC和AOP,通常我们想要调用对象中的方法是先创建对象,由对象调用方法。
而IOC省略了创建对象的这一步骤,直接调用方法。下面来介绍下IOC的实现方式:
第一种:
通过构造方法创建对象(常用的方式)
appicationContext.xml配置文件
<!--配置我们的Dog类 spring 框架在底层
通过反射的机制 执行了我们的构造方法-->
<bean id="dog" class="cn.pb.dao.impl.Dog"></bean>测试代码:
@Test public void test05(){ ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); System.out.println("********"); /** * 因为我们在容器中定义了id 根据id找到对应的类 * 这里的dog是通过构造方法创建的 */ Animal dog=(Animal) context.getBean("dog"); dog.eat(); dog.sleep(); }
第二种:
通过静态工厂方法创建对象
<!--02.通过静态工厂 来创建我们对象的实例 工厂的本身构造不会执行 因为我们的方法是静态的 !类只会被加载,不会被实例化! getDog必须是静态的-->
<bean id="dog" class="cn.pb.util.AnimalFactory" factory-method="getDog"></bean>
测试代码:
//使用静态工厂来创建对象 @Test public void test06(){ ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); System.out.println("*************************"); /** * 因为我们在容器中定义了id 根据id找到对应的类 * 是通过静态工厂来创建的 不走静态工厂的构造方法 * 工厂的本身构造不会执行 因为我们的方法是静态的 !类只会被加载,不会被实例化! */ Animal dog=(Animal) context.getBean("dog"); dog.eat(); dog.sleep(); }
第三种:
通过动态工厂方法创建对象
<!--03.动态工厂创建 对象的实例-->
<bean id="factory" class="cn.pb.util.AnimalFactory"></bean><!-- 调用哪个工厂里的哪个方法 来创建对象 对象的id是dog-->
<bean id="dog" factory-bean="factory" factory-method="getDog"/>
代码测试:
//使用动态工厂来创建对象 @Test public void test06(){ ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); System.out.println("*************************"); /** * 因为我们在容器中定义了id 根据id找到对应的类 * 是通过动态工厂来创建的 首先要获得动态工厂的bean * 然后再dog的bean */ Animal dog=(Animal) context.getBean("dog"); dog.eat(); dog.sleep(); }
验证bean的生命周期
//初始化之后的方法 public void init(){ System.out.println("初始化之后的方法"); } //销毁之前的方法 public void destroy(){ System.out.println("销毁之前的方法"); }
<!-- 设置bean的生命始末 --> <bean id="dog" class="cn.pb.dao.impl.Dog" init-method="init" destroy-method="destroy"></bean>测试代码:
/**
* 设置bean的生命周期始末
* 01.在Dog类中新增两个方法 init() destroy()
* 02.在容器中 配置
* init-method="init" destroy-method="destroy"
*/
@Test
public void test08(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println("*************************");
Animal dog=(Animal) context.getBean("dog");
System.out.println(dog);
/*
* 想看到destroy-method="destroy" 的效果 有两个前提
* 01.bean必须是单例的
* 02.容器需要手动的关闭
*/
((ClassPathXmlApplicationContext)context).close();
}