容器設計是項目編碼中非常常見的一個場景,本文從項目中習以為常的一些場景作為切入點,聊一聊容器設計的一些思考、聊一聊元素遍歷的思路、以及身為設計模式之一的迭代器模式。 ...
Spring 後置處理器【1】 簡單介紹
一句話:bean 在初始化前或初始化後的瞬間,我自己添加一些業務邏輯
bean 後置處理器類的內容
簡單代碼
package com.hspedu.spring.bean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
/**
* @Author:PigBrother
* @Date:2022/9/22
* @Description:ToDo
*/
public class MyBeanPostProcessor implements BeanPostProcessor {
/**
* Before : 說明在bean 初始化前被調用
* @param bean 在ioc 容器中, 我配置的bean 對象
* @param beanName 在ioc 容器中,bean 的 id
* @return bean 返回處理後的bean 對象
* @throws BeansException
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
// 寫業務邏輯:在bean 初始化前,修改其一些屬性
System.out.println("postProcessBeforeInitialization() 方法被調用");
System.out.println("bean = " + bean);
System.out.println("beanName = " + beanName);
return bean;
}
/**
* after : 說明在bean 初始化後被調用
* @param bean 在ioc 容器中, 我配置的bean 對象
* @param beanName 在ioc 容器中,bean 的 id
* @return bean 返回處理後的bean 對象
* @throws BeansException
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
// 寫業務邏輯:在bean 初始化前,修改其一些屬性
System.out.println("postProcessAfterInitialization() 方法被調用");
System.out.println("bean = " + bean);
System.out.println("beanName = " + beanName);
return bean;
}
}
代碼解讀
- 實現 BeanPostProcessor 介面
- postProcessBeforeInitialization 和 postProcessAfterInitialization 兩個方法
- 在兩個方法中寫業務邏輯
容器配置文件(即xml 文件)
測試代碼
測試代碼
@Test
public void beanProcessorTest() {
ApplicationContext ioc = new ClassPathXmlApplicationContext("beans02.xml");
House house = ioc.getBean("house", House.class);
System.out.println(house);
// 關閉ioc 容器
((ClassPathXmlApplicationContext)ioc).close();
}
測試結果
Spring 後置處理器的簡單應用
將容器內的所有bean的某一個屬性的值統一改為另一個值
有 AOP 的一點影子了
將大豪宅改成香港豪宅
package com.hspedu.spring.bean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
/**
* @Author:PigBrother
* @Date:2022/9/22
* @Description:ToDo
*/
public class MyBeanPostProcessor implements BeanPostProcessor {
/**
* Before : 說明在bean 初始化前被調用
* @param bean 在ioc 容器中, 我配置的bean 對象
* @param beanName 在ioc 容器中,bean 的 id
* @return bean 返回處理後的bean 對象
* @throws BeansException
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
// 寫業務邏輯:在bean 初始化前,修改其一些屬性
System.out.println("postProcessBeforeInitialization() 方法被調用; 將所有豪宅改成香港豪宅");
if (bean instanceof House) {
House house = (House) bean;
house.setName("香港豪宅");
}
return bean;
}
/**
* after : 說明在bean 初始化後被調用
* @param bean 在ioc 容器中, 我配置的bean 對象
* @param beanName 在ioc 容器中,bean 的 id
* @return bean 返回處理後的bean 對象
* @throws BeansException
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
// 寫業務邏輯:在bean 初始化前,修改其一些屬性
System.out.println("postProcessAfterInitialization() 方法被調用");
System.out.println("bean = " + bean);
System.out.println("beanName = " + beanName);
return bean;
}
}