当前位置: 首页 > wzjs >正文

陕西网站开发联系方式产品设计经典案例

陕西网站开发联系方式,产品设计经典案例,做网站感觉挣不到钱啊,越策网站建设1. InitializingBean 简介 1.1 功能简介 InitializingBean 是 Spring 框架中的一个接口,用在 Bean 初始化后执行自定义逻辑。它提供了 afterPropertiesSet() 方法,该方法在以下时机被 Spring 容器自动调用: 属性注入完成后(即所…

1. InitializingBean 简介

1.1 功能简介

InitializingBean 是 Spring 框架中的一个接口,用在 Bean 初始化后执行自定义逻辑。它提供了 afterPropertiesSet() 方法,该方法在以下时机被 Spring 容器自动调用:

  1. 属性注入完成后(即所有通过 setter 方法或构造函数注入的属性已设置完毕)。
  2. Bean 初始化阶段的最后一步(在调用 @PostConstruct 注解的方法之后,如果同时存在的话)。

核心方法

  • void afterPropertiesSet():需要实现此方法以定义初始化逻辑。

1.2 用法演示

step1. 定义一个实现 InitializingBean 的 Bean

import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.InitializingBean;public class UserBean implements InitializingBean {private String name;// 属性注入需要 setter 方法public void setName(String name) {this.name = name;}// 实现 InitializingBean 接口的 afterPropertiesSet 方法@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("InitializingBean 的 afterPropertiesSet() 被调用。");System.out.println("用户名称: " + name);}
}

step2. Spring 配置类(Java 配置)

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Bean(name = "userBean")public UserBean userBean() {UserBean bean = new UserBean();bean.setName("John Doe"); // 通过 setter 注入属性return bean;}
}

step3. 启动 Spring 容器并测试

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class SpringDemo {public static void main(String[] args) {// 创建 Spring 应用上下文ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);// 获取 Bean(此时已触发初始化逻辑)UserBean userBean = context.getBean("userBean", UserBean.class);// 输出结果示例:// InitializingBean 的 afterPropertiesSet() 被调用。// 用户名称: John Doe}
}

2. @PostConstruct简介

2.1 功能简介

@PostConstruct 是 Java EE/Jakarta EE 中的一个注解(定义于 JSR-250 规范),用于标记一个方法在依赖注入完成后执行初始化操作。它通常与 Spring 框架一起使用,适用于需要在对象初始化时执行特定逻辑的场景。

核心功能

1. 初始化方法:标注的方法会在以下两个操作完成后被调用:

  • 依赖注入(DI)完成:Spring 容器完成对 Bean 的属性注入(如 @Autowired@Value 等)。
  • Bean 实例化:Bean 对象被创建后。

2. 执行时机: 是 Bean 生命周期中的一个关键步骤,通常在 @Autowired 或其他注入方式完成后执行,但早于 @PreDestroy 注解的销毁方法。

方法约束

  • 无参数且无返回值:被标注的方法必须是 void 类型且无参数。
@PostConstruct
public void init() { ... } // 正确
  • 不抛出受检异常:方法不能声明抛出受检异常(checked exception),否则会抛出 BeanCreationException
@PostConstruct
public void init() throws IOException { ... } // 错误!
  • 实例方法:只能标注在实例方法上,不能用于静态方法或字段。
  • 唯一性:一个 Bean 中只能有一个 @PostConstruct 方法,否则会引发冲突。

使用场景

  • 资源初始化:例如建立数据库连接、初始化缓存、加载配置等。
  • 依赖验证:检查注入的依赖是否合法。
  • 状态初始化:设置 Bean 的初始状态。

注意事项

  • 依赖必须注入完成:在 @PostConstruct 方法中,所有通过 @Autowired 等注入的依赖均已可用。
  • 执行顺序: 在以下步骤中触发:Bean 实例化 → 依赖注入 → @PostConstruct 方法 → BeanPostProcessor.postProcessAfterInitialization()

2.2 用法演示

import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;public class MyService {@Autowiredprivate MyRepository repository;@PostConstructpublic void init() {// 在依赖注入完成后执行的初始化逻辑System.out.println("Repository is initialized: " + repository);// 可在此处进行数据库连接或其他初始化操作}
}

3. InitializingBean 和 @PostConstruct 的对比分析

3.1 对比分析

对比维度@PostConstructInitializingBean
来源Java EE 标准注解(javax.annotation.PostConstruct)。Spring 框架接口(org.springframework.beans.factory.InitializingBean)。
执行时机属性注入完成后立即执行(在 InitializingBean 的 afterPropertiesSet() 之前)。属性注入完成后执行(在 @PostConstruct 之后)。
使用方式直接在方法上添加注解,无需实现接口。需要实现接口并重写 afterPropertiesSet() 方法。
依赖性需要引入 javax.annotation 依赖(Java 9+ 内置,低版本需手动添加)。无需额外依赖(Spring 自带)。
适用场景简单的初始化逻辑,且希望代码不依赖 Spring 特定接口。需要与 Spring 生命周期深度集成(如依赖 Spring 特定功能)或需兼容旧代码。
侵入性更简洁,无接口侵入。需实现接口,具有侵入性。

2. 代码演示:同时使用两者,验证执行顺序

step1: 定义一个同时使用 @PostConstruct 和 InitializingBean 的 Bean

import javax.annotation.PostConstruct;
import org.springframework.beans.factory.InitializingBean;public class MyBean implements InitializingBean {public MyBean() {System.out.println("构造函数被调用");}@PostConstructpublic void initByPostConstruct() {System.out.println("@PostConstruct 方法执行");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("InitializingBean.afterPropertiesSet() 执行");}
}

step2. Spring 配置类(Java 配置)

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic MyBean myBean() {return new MyBean();}
}

step3. 启动 Spring 容器并观察输出

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Main {public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);// 输出顺序:// 1. 构造函数被调用// 2. @PostConstruct 方法执行// 3. InitializingBean.afterPropertiesSet() 执行}
}

输出结果:

构造函数被调用
@PostConstruct 方法执行
InitializingBean.afterPropertiesSet() 执行

关键点解释

  1. 执行顺序

    • @PostConstruct 的方法优先于 InitializingBean 的 afterPropertiesSet() 执行。
    • 这是因为 Spring 在初始化 Bean 时,会先处理注解(如 @PostConstruct),再触发接口定义的回调(如 InitializingBean)。
  2. 构造函数与初始化方法

    • 构造函数在 Bean 实例化时调用(属性未注入)。
    • 初始化方法(@PostConstruct 和 InitializingBean)在属性注入完成后调用

3.3 选择建议

根据场景选择

  • 推荐使用 @PostConstruct 的场景

    • 需要 简洁代码,避免实现接口。
    • 不依赖 Spring 特殊功能,仅需基础初始化逻辑。
    • 需要在 更早阶段 执行初始化(如依赖注入后立即初始化资源)。
  • 推荐使用 InitializingBean 的场景

    • 需要与 Spring 的生命周期深度集成(例如访问 Spring 上下文)。
    • 项目已有大量使用 InitializingBean 的代码,无需迁移成本。
    • 需要分阶段执行初始化逻辑(如先 @PostConstruct 处理基础逻辑,再通过 InitializingBean 执行 Spring 特定逻辑)。

总结

  • @PostConstruct 是更现代、简洁的选择,且与 Spring 无关(可跨框架使用),适合大多数场景。可视为在 Spring 中用于替代 InitializingBean 接口或 XML 配置的初始化方法,简化代码并提高可读性。
  • InitializingBean 适合需要与 Spring 生命周期深度耦合的情况。但需实现接口,侵入性较强,优先使用@PostConstruct
  • 若同时使用两者,需注意执行顺序并合理规划逻辑分阶段。

3.4 其他替代选择

1. @Bean(initMethod = "...") 在配置类中指定初始化方法:

@Bean(initMethod = "customInit")
public MyService myService() {return new MyService();
}

2. init-method 属性(XML 配置):

<bean id="myBean" class="com.example.MyBean" init-method="customInitMethod"/>

http://www.dtcms.com/wzjs/578476.html

相关文章:

  • 一句话让客户主动找你乐清网站优化
  • 国外网站的建设未来前景比较好的行业有哪些
  • 网站模版 下载工具网统管公司的网站托管服务怎么样
  • wix怎样做网站平台公司代理注册
  • 网站形式的设计哈尔滨网站建设价格低
  • 花生壳做局域网站宁波哪里有网站建设
  • dede 电商网站jsp网站开发实例pdf
  • 建三江廉政建设网站句容网站开发
  • 广告公司网站设计策划书北京企业网站建设价格
  • 网络直播营销的方式有哪些电脑优化工具
  • 石龙镇住房规划建设局网站汕头seo排名公司
  • 企业网站建设要注意北京网智易通科技有限公司
  • 做网站横幅的图片多大python创建网页
  • asp商品网站源码工业和信息化部教育与考试中心
  • 腾讯微校怎么做微网站一个网站的渠道网络建设
  • 吉首做网站产品外观设计收费标准
  • 郑州网站外包公司wordpress建站不懂程序
  • 中小企业还需要网站吗响应式网站成本
  • 企业网站功能模块网站开发asp
  • 网站建设案例企业Wordpress用mvc开发吗
  • 北京住房城乡建设部网站郑州网站竞价托管
  • 网站域名注册备案教程小程序开发公司主页制作标准
  • 下载一个网站怎么在悉尼做网站
  • 网站制作策划wordpress pjax
  • 代做论文 软件指导去哪些网站软件开发流程图visio
  • 微信网站开发需要什么知识最具有口碑的网站建设
  • 介绍做燕窝的网站深圳有多少家设计公司
  • 网站手机客户端制作网站开发人员的职能
  • 做视频网站程序多少钱绵阳网站建设 经开区
  • 商贸公司网站建设如何做外链