Spring 基于XML的IoC

基于XML的IoC

1 静态工厂类

使用静态工厂来获取其他类

**使用场景:**在整合第三方架构时,有提供的静态工厂类,我们想获取工厂类生成的对象

①创建静态工厂类

用于返回需要生成的类对象

public class DaoFactory {
	
	/**
	 * 返回创建的实例
	 * @return
	 */
	public static UserDao createUserDao() {
		return new UserDaoImpl();
	}
}

②配置XML文件

将静态工厂交给spring管理。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 

	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	
	xsi:schemaLocation=" 
	
	http://www.springframework.org/schema/beans 
	
	http://www.springframework.org/schema/beans/spring-beans.xsd"> 
	
	<!-- class指定该类的全限定类名,factory-method指定该类的方法 -->
	<bean id="user" class="com.util.DaoFactory" factory-method="createUserDao"></bean>
	
</beans>

③测试类

public class Main {
	public static void main(String[] args) {
		ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
		UserDaoImpl user=(UserDaoImpl) context.getBean("user");
		user.save();
	}
}

注意

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Bz84YI8-1606466577586)(C:\Users\stad\AppData\Roaming\Typora\typora-user-images\image-20200826144236617.png)]

当出现以上报错时,说明当前取到的值是DaoFactory类型的值,无法强转为dao.UserDao类型。

2 实例工厂bean

在工厂模式中,所有生成实例的方法是普通方法。这一类型的工厂类称为实例工厂bean。

①实例工厂类

注意实例工厂类中的方法并不是静态方法。

public class DaoFactory {
	
	/**
	 * 返回创建的实例
	 * @return
	 */
	
	public UserDao createUserDao1() {
		return new UserDaoImpl();
	}
}

②配置xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 

	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	
	xmlns:context="http://www.springframework.org/schema/context"
	
	xmlns:p="http://www.springframework.org/schema/p"
	
	xmlns:aop="http://www.springframework.org/schema/aop"
	
	xsi:schemaLocation=" 
	
	http://www.springframework.org/schema/beans 
	
	http://www.springframework.org/schema/beans/spring-beans.xsd
	
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
	
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
	"> 
	
	<!-- 工厂bean -->
	<bean id="factory" class="com.util.DaoFactory"></bean>
	
	<!-- 调用工厂类中的普通方法 -->
    <!-- factory-bean指定工厂bean的id -->
    <!-- factory-method指定工厂类中的方法 -->
	<bean id="userDao" factory-bean="factory" factory-method="createUserDao1"></bean>

</beans>

③测试类

public class Main {
	public static void main(String[] args) {
		ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext2.xml");
		UserDaoImpl user=(UserDaoImpl) context.getBean("userDao");
		user.save();// 调用生成该类实例中的方法
	}
}

④生成的实例

public class UserDaoImpl implements UserDao{

	public void UserDao() {
		System.out.println("构造方法");
	}
	
	@Override
	public void save() {
		System.out.println("save方法");
	}
	
}

3 Bean的生命周期

5.1 构造方法

5.2 初始化方法

为了给当前实例赋初始化值。在构造方法执行后立即执行。

在xml bean中配置init-method属性。

5.3 销毁方法

为了释放相关连接和资源。在该容器结束之前调用。

在xml中配置distory-method属性。

ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");

当对象是以上对象时才有close方法。

4 后处理Bean

后处理需要实现一个接口,并实现其中的方法,用来监听容器中bean的初始化方法的执行。

Java代码

创建一个类实现BeanPostProcessor接口,并重写postProcessAfterInitializationpostProcessBeforeInitialization方法。

/**
 * 自定义的后处理bean
 * @author stad
 *
 */
public class MyPostProcessor implements BeanPostProcessor {

	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		System.out.println("初始化后");
		return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
	}

	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		System.out.println("初识化前的 ");
		return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
	}

}

配置xml文件

将自定义的后处理Java类交给Spring管理,这里不需要id。

	<!-- 后处理bean,不需要id -->
	<bean class="com.util.MyPostProcessor"></bean>

这样在生成其他的实例时,后处理bean就会自行执行。

应用场景

对容器中的所有bean需要做功能扩展,或在初始化前需要增强功能,可以使用后处理bean,在Spring框架中很多功能使用了后处理bean。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值