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);
SpringIOC day_3
猜你喜欢
转载自blog.csdn.net/qq_42676998/article/details/83379327
今日推荐
周排行