SpringIOC day

xiaoxiao2025-07-12  8

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

 

转载请注明原文地址: https://www.6miu.com/read-5032965.html

最新回复(0)