基于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
接口,并重写postProcessAfterInitialization
和postProcessBeforeInitialization
方法。
/**
* 自定义的后处理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。