//可以让我们自定义Bean的创建过程,完成复杂bean定义public interface FactoryBean<T> { //返回FactoryBean创建的实例,如果isSingleton返回true,则该实例会放到Spring容器的单例缓存池中Map @Nullable T getObject() throws Exception; //返回FactoryBean创建的bean类型 @Nullable Class<?> getObjectType(); //返回作用域是否单例 default boolean isSingleton() { return true; }}2.2.1 新建类CompanyFactoryBean,实现FactoryBean接口,并重写方法:
public class CompanyFactoryBean implements FactoryBean<Company> { private String companyInfo;//注入公司名称,地址,规模 以逗号分隔 public void setCompanyInfo(String companyInfo) { this.companyInfo = companyInfo; } @Override public Company getObject() throws Exception { //创建复杂对象Company Company company=new Company(); String[] split = companyInfo.split(","); company.setName(split[0]); company.setAddress(split[1]); company.setScale(Integer.parseInt(split[2])); return company; } @Override public Class<?> getObjectType() { //返回bean的类型 return Company.class; } @Override public boolean isSingleton() { //是否是单例 return true; }}public class Company { private String name; private String address; private int scale; //省略getset 和toString}2.2.2 xml文件中配置bean
<bean id="companyBean" class="com.lagou.edu.factory.CompanyFactoryBean"> <property name="companyInfo" value=https://www.isolves.com/it/cxkf/kj/2020-12-03/"拉钩,中关村,500">2.2.3 测试
@org.junit.Test public void test(){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); Object companyBean = applicationContext.getBean("companyBean"); System.out.println(companyBean); }//结果返回的是 Company{name='拉钩', address='中关村', scale=500} 虽然在xml配置文件中配置的bean的class="com.lagou.edu.factory.CompanyFactoryBean" 但是返回的Company类型 。
如何返回CompanyFactoryBean类型呢?

文章插图
打印结果为:com.lagou.edu.factory.CompanyFactoryBean@545b995e
3. 后置处理器Spring提供了两种后处理bean的扩展接?,分别为 BeanPostProcessor 和BeanFactoryPostProcessor,两者在使?上是有所区别的 。
??初始化(BeanFactory)—> Bean对象
在BeanFactory初始化之后可以使?BeanFactoryPostProcessor进?后置处理做?些事情
在Bean对象实例化(并不是Bean的整个?命周期完成)之后可以使?BeanPostProcessor进?后置处理做?些事情
注意:对象不?定是springbean,?springbean?定是个对象
3.1 SpringBean生命周期图

文章插图
按照上述描述的打印一下 。看看是否一致:
//实现了BeanNameAware、BeanFactoryAware、ApplicationContextAware、InitializingBean,DisposableBean接口public class Result implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean { private String status; private String message; //省略getset toString方法 @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { System.out.println("4.BeanFactoryAware:"+beanFactory); } @Override public void setBeanName(String name) { System.out.println("3.BeanNameAware:"+name); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { System.out.println("5.ApplicationContextAware:"+applicationContext); } @Override public void afterPropertiesSet() throws Exception { System.out.println("7.InitializingBean"); } public void initMethodTest(){ System.out.println("8.initMethod"); } @PostConstruct public void postCoustrcut(){ System.out.println("postCoustrcut"); } //销毁之前执行 @PreDestroy public void preDestroy(){ System.out.println("销毁之前执行"); } @Override public void destroy() throws Exception { System.out.println("DisposableBean"); }}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 鱿鱼和八爪鱼的区别
- 尖椒酱的做法大全
- 翡翠|翡翠很善变你知道吗
- 苕粉和宽粉一样吗 宽粉苕粉区别
- 宽粉煮多久几分钟能熟 宽粉多久可以煮熟
- 狗狗不喜欢剪指甲 狗狗剪指甲不配合怎么办
- 从零开始入门K8S| 从Spring Cloud到Kubernetes的微服务迁移实践
- 非人学园即将到来的联动 非人学园联动美好世界什么时候出
- 怎样养胃 几款食疗秘方帮你养胃
- 消炎药应该饭前还是饭后吃
