Aware回调机制与初始化Aware回调那如果我们需要获取当前bean的名字呢?那就得通过Aware回调机制 。我们需要创建一个BeanNameAware接口,里面提供一个setBeanName方法 。
public interface BeanNameAware { public void setBeanName(String beanName);}在createBean方法中去编写回调机制,通过判断这个实例是否有BeanNameAware这个类,通过setName方法间接传递了beanName 。
// 4 Aware回调机制if (instance instanceof BeanNameAware) { ((BeanNameAware)instance).setBeanName(beanName);}在UserService方法中去实现这个BeanNameAware方法,这就能够在UserService里的beanName字段中得到这个bean对象的真实的beanName了 。
@Component("userService") // 注入spring@Scope("property")public class UserService implements BeanNameAware, InitializingBean { @Autowired private RoleService roleService; // 依赖注入,加上@Autowired注解 private String beanName; @Override public void setBeanName(String beanName) { this.beanName = beanName; } public void test() { System.out.println("RoleService: " + roleService); } @Override public void afterPropertiesSet() { // ...... System.out.println("初始化"); }}初始化在spring容器中,不只是完成bean对象的创建,还需要能够对bean进行初始化 。需要创建InitializingBean接口类 。
public interface InitializingBean { public void afterPropertiesSet();}在需要进行初始化的bean对象去实现这个接口的方法,这里main可以进行一些操作 。在createBean中,会根据判断是否有InitializingBean类,会在实例化之后调用这个方法进行初始化 。
// 5 初始化if (instance instanceof InitializingBean) { ((InitializingBean)instance).afterPropertiesSet();}结果

文章插图
BeanPostProcessorBeanPostProcessor可以对spring中bean的创建去做一些操作 。
BeanPostProcessor接口在spring中定义一个BeanPostProcessor接口,里面会有初始化前后操作的方法,并且将beanName和bean对象带入进行自定义的操作 。
【【Spring系列】- 手写模拟Spring框架】public interface BeanPostProcessor { public Object postBeforeProcessor(String beanName, Object bean); // 初始化前 public Object postAfterProcessor(String beanName, Object bean); // 初始化后}自定义BeanPostProcessor这里可以定义自己的类去实现spring中的BeanPostProcessor,对初始化进行一些相应操作 。并且能够根据某个bean对象来做不同的操作 。原理就是将MyBeanPostProcessor注入到容器中,在扫描的时候将这个对象保存起来,在创建bean的时候去遍历BeanPostProcessor集合,在去调用这个实例的方法 。
@Component // 需要注入springpublic class MyBeanPostProcessor implements BeanPostProcessor { @Override public Object postBeforeProcessor(String beanName, Object bean) { System.out.println("初始化前的bean:" + beanName + " -- " + bean); return bean; } @Override public Object postAfterProcessor(String beanName, Object bean) { System.out.println("初始化后的bean:" + beanName + " -- " + bean); return bean; }}
经验总结扩展阅读
- 冰的熔点是多少
- 【ASP.NET Core】MVC控制器的各种自定义:应用程序约定的接口与模型
- 基础版 【网络】内网穿透方案&FRP内网穿透实战
- 金线莲的吃法
- 2023年9月6日是疏通管道吉日吗 2023年9月6日适合疏通管道吗
- 半亩是多少
- 银耳可以泡一晚上再煮吗
- 熊猫便便有什么用
- 清除青苔最有效的方法
- 油是导体还是绝缘体