SpringIOC day_3

IOC容器的生命周期

一、SpringIOC容器可以管理BEAN的生命周期

管理过程:

1. 通过工厂方法构造器创建Bean实例

2.为Bean的属性设置值和其对其他BEAN的引用

3.调用BEAN的初始化方法(init)

4.使用BEAN

5.当容器关闭时 调用BEAN 的销毁方法

<bean id="car" class="com.Greatest.Spring.life" init-method="init" destroy-method="destroy">

</bean>

二、创建Bean的后置处理器

即在Bean调用初始化方法前后做一些处理

后置处理器将对IOC容器中的所有Bean进行处理

类 实现(implements)BeanPostProcessor接口
1 通过构造器或工厂方法创建 Bean 实例
2 为 Bean 的属性设置值和对其他 Bean 的引用
3 将 Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法
4 调用 Bean 的初始化方法
5 将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization方法
6 Bean 可以使用了
7 当容器关闭时, 调用 Bean 的销毁方法



public class BeanPostProcessorTest implements BeanPostProcessor{

@Override

public Object postProcessAfterInitialization(Object arg0, String arg1) throws BeansException {

System.out.println("postProcessAfterInitialization "+arg1);

return arg0;

}

@Override //Bean BEANNAME

public Object postProcessBeforeInitialization(Object arg0, String arg1) throws BeansException {

if(arg1.equals("car")){

Car c=(Car) arg0;

c.setBrand("玛莎拉蒂");

}

System.out.println("postProcessBeforeInitialization" +arg1);

return arg0;

}

}

<bean id="car" class="com.Greatest.Spring2.dbutil.Car" init-method="init" destroy-method="destroy" p:brand="Audi" p:price="320000" p:maxSpeed="1200">

</bean>

<bean id="bean" class="com.Greatest.Spring2.init.BeanPostProcessorTest">

</bean>

<bean id="car1" class="com.Greatest.Spring2.dbutil.Car" init-method="init" destroy-method="destroy" p:brand="Auto" p:price="230000" p:maxSpeed="12200">

</bean>

通过工厂方法创建Bean

一静态工厂方法创建Bean

•要声明通过静态方法创建的 Bean, 需要在 Bean 的 class 属性里指定拥有该工厂的方法的类, 同时在 factory-method 属性里指定工厂方法的名称. 最后, 使用 <constrctor-arg> 元素为该方法传递方法参数.

<!--手写一个Factory类 创建静态方法返回实例

factory-method指向 对应的静态方法

如有参数 construction-arg 进行赋值 -->

<bean id="car" class="com.Greatest.Spring.Factory.StaticFactory" factory-method="getCar" >

<constructor-arg value="Bmw"></constructor-arg></bean>

public class StaticFactory{

private static Map<String,Car> map=null;

static {

map=new HashMap<>();

map.put("Audi", new Car("奥迪",12000,1200,false));

map.put("Auto", new Car("奥拓",1200,120,false));

map.put("Bmw", new Car("宝马",32000,3200,false));

map.put("BC", new Car("奔驰",22000,2200,false));

}

public static Car getCar(String name){

return map.get(name);

}

}

//二 通过实例工厂方式创建Bean

将对象的创建过程封装到另一个对象实例的方法中

<!-- 创建实例工厂

创建实例工厂的bean

在需要的bean中 通过factory-bean 引用工厂实例的bean

factory-method 调用获取实例的方法

-->

<bean id="factory" class="com.Greatest.Spring.Factory.InstancecFactory2" >

</bean>

<bean id="car1" class="com.Greatest.Spring.Factory.StaticFactory" factory-bean="factory" factory-method="getCar" >

<constructor-arg value="BC"></constructor-arg>

</bean>

public class StaticFactory{

private static Map<String,Car> map=null;

static {

map=new HashMap<>();

map.put("Audi", new Car("奥迪",12000,1200,false));

map.put("Auto", new Car("奥拓",1200,120,false));

map.put("Bmw", new Car("宝马",32000,3200,false));

map.put("BC", new Car("奔驰",22000,2200,false));

}

非静态的方法

public Car getCar(String name){

return map.get(name);

}

}

三、实现FactoryBean接口

XML

<bean id="car2" class="com.Greatest.Spring.Factory.FactoryBeans"></bean>

</beans>

Class

public class FactoryBeans implements FactoryBean{



@Override

public Object getObject() throws Exception {

System.out.println("getObject..");

return new Car("兰博基尼",120000,2300,true);

}



@Override

public Class getObjectType() {

// TODO Auto-generated method stub

return null;

}



@Override

public boolean isSingleton() {

// TODO Auto-generated method stub

return false;

}



}

在ClassPath中扫描组件

Spring能够在Classpath下进行自动扫描 侦测和实例化具有特定注解的组件

–@Component: 基本注解, 标识了一个受 Spring 管理的组件

–@Respository: 标识持久层组件

–@Service: 标识服务层(业务层)组件

–@Controller: 标识表现层组件

•对于扫描到的组件, Spring 有默认的命名策略: 使用非限定类名, 第一个字母小写. 也可以在注解中通过 value 属性值标识组件的名称

申明在那个包下的都可以扫描

<!-- <context:component-scan base-package="scan"

use-default-filters="false"

resource-pattern="/*.class"

></context:component-scan>

--> <context:component-scan base-package="scan"

>

<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>

</context:component-scan>

–<context:include-filter> 子节点表示要包含的目标类

–<context:exclude-filter> 子节点表示要排除在外的目标类

Main:

Respoaitroyimp r=(Respoaitroyimp)ap.getBean("respoaitroyimp");

System.out.println(r);

猜你喜欢

转载自blog.csdn.net/qq_42676998/article/details/83379327