spring 动态注册bean实现记录

一、 需要动态实现bean注册原因

  1. 在普通spring项目升级为springboot项目,由于需要针对springmvc中的过滤器(Filter)需要控制调用顺序;
  2. 找了一些资料添加@Order注解,实现Ordered接口发现定义的顺序号不生效。
  3. 通过手动注册的 org.springframework.boot.web.servlet.FilterRegistrationBean 去设置过滤器,发现里面设置的顺序号,能够控制过滤器调用执行顺序;
@Bean
    public FilterRegistrationBean filterRegistrationBean1(){
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(过滤器2);
        registration.setOrder(1);
        return registration;
    }
    @Bean
    public FilterRegistrationBean filterRegistrationBean2(){
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(过滤器2);
        registration.setOrder(2);
        return registration;
    }
  1. 上述代码注册进去后可以保证过滤器的执行顺序,但是存在一个问题没加一个过滤器都要写一个Bean(FilterRegistrationBean ),比较麻烦;
  2. 所有考虑通过注解动态注入Bean(FilterRegistrationBean ),只需要写一个类配置一下即可。
  3. 实现依赖spring中两个接口(org.springframework.context.annotation.ImportBeanDefinitionRegistrar、org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor)
  4. 这两个接口实现一个都能实现动态注册,会有一点区别,想要写成一个starter,使用时自动装配。

二、 通过实现org.springframework.context.annotation.ImportBeanDefinitionRegistrar

  1. 自定义实现工厂bean(FactoryBean),生成bean对应使用,主要使用里面的getObject方法
  2. 自定义类实现ImportBeanDefinitionRegistrar,实现registerBeanDefinitions方法:
@Override
    public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
        // 1. 初始化类扫描器, spring 提供扫描包路径下内容获取到BeanDefinition集合
        ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false, this.environment){
            @Override
            protected boolean isCandidateComponent(
                    AnnotatedBeanDefinition beanDefinition) {
                boolean isCandidate = false;
                if (beanDefinition.getMetadata().isIndependent()) {
                    if (!beanDefinition.getMetadata().isAnnotation()) {
                        isCandidate = true;
                    }
                }
                return isCandidate;
            }
        };

        // 2. 扫描器添加过滤条件,不是所有的类都需要
        scanner.setResourceLoader(this.resourceLoader);
        AnnotationTypeFilter filter = new AnnotationTypeFilter(YsxnFilter.class);
        scanner.addIncludeFilter(filter);// 添加注解类型过滤

        // 3. 获取BeanDefinition 列表
        //List<String> scanPackages = properties.getScanPackages();
        Set<BeanDefinition> beanDefinitions = scanner.findCandidateComponents(FilterConstant.DEFAULT_PACKAGE);
       /* if (scanPackages != null && scanPackages.size()>0){
            for (String scanPackage : scanPackages) {
                beanDefinitions.addAll(scanner.findCandidateComponents(scanPackage));
            }
        }*/

        for (BeanDefinition beanDefinition : beanDefinitions) {
            ScannedGenericBeanDefinition annotatedBeanDefinition = (ScannedGenericBeanDefinition) beanDefinition;
            AnnotationMetadata annotationMetadata = annotatedBeanDefinition.getMetadata();

            // 4. 开始注册
            registerWebFilter(registry, annotationMetadata);

        }
    }

    private void registerWebFilter(BeanDefinitionRegistry registry, AnnotationMetadata metadata) {
        // 1. 获取注解参数
        Map<String, Object> attributes = metadata.getAnnotationAttributes(YsxnFilter.class.getCanonicalName());
        String className = metadata.getClassName();
        try {
            Object o = Class.forName(className).newInstance();
            if (!(o instanceof Filter)){
                // 没有实现javax.servlet.Filter接口,不进行注册处理
                return;
            }
            BeanDefinitionBuilder bdf = BeanDefinitionBuilder.genericBeanDefinition(WebFilterFactoryBean.class);
            Object initParams = attributes.get("initParams");
            List<WebInitParam> initParamList = new ArrayList<>();
            if (initParams != null){
                AnnotationAttributes[] attrs = (AnnotationAttributes[])initParams;
                for (AnnotationAttributes attr : attrs) {
                    initParamList.add(new WebInitParam(attr.getString("name"),
                            attr.getString("value"), attr.getString("description")));
                }
            }

            bdf.addPropertyValue("filter", o)
                    .addPropertyValue("order", attributes.get("order"))
                    .addPropertyValue("displayName", attributes.get("displayName"))
                    .addPropertyValue("initParams", initParamList)
                    .addPropertyValue("filterName", attributes.get("filterName"))
                    .addPropertyValue("servletNames", attributes.get("servletNames"))
                    .addPropertyValue("urlPatterns", attributes.get("urlPatterns"))
                    .addPropertyValue("dispatcherTypes", attributes.get("dispatcherTypes"))
                    .addPropertyValue("asyncSupported", attributes.get("asyncSupported"));
            AbstractBeanDefinition beanDefinition = bdf.getBeanDefinition();
            registry.registerBeanDefinition(className, beanDefinition);
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

三、 实现接口org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor

  1. 同理也需要定义类实现FactoryBean
  2. 定义类实现接口BeanDefinitionRegistryPostProcessor实现方法postProcessBeanDefinitionRegistry,此时去调用动态注入的逻辑;

四、实现代码:springboot中Filter顺序控制

  1. 定义Filter注解,后面扫描到添加这个注解的类才进行注入
import javax.servlet.DispatcherType;
import javax.servlet.annotation.WebInitParam;
import java.lang.annotation.*;

/**
 * @author : xlw
 * @since : 2023-09-08 10:16
 * YsxnFilter
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface YsxnFilter {

    int order() default 0;

    String description() default "";

    String displayName() default "";

    WebInitParam[] initParams() default {};

    String filterName() default "";

    String smallIcon() default "";

    String largeIcon() default "";

    String[] servletNames() default {};


    String[] value() default {};


    String[] urlPatterns() default {};

 
    DispatcherType[] dispatcherTypes() default {DispatcherType.REQUEST};


    boolean asyncSupported() default false;
}

  1. 配置类,自动装配使用
import com.filter.manager.WebFilterAutoRegistryManager;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;

/**
 * @author : xlw
 * @since : 2023-09-08 13:53
 * EnableFilterAutoRegistryAutoConfiguration
 */
@Import({FilterProperties.class})
public class EnableFilterAutoRegistryAutoConfiguration {

    @Bean
    public WebFilterAutoRegistryManager webFilterAutoRegistryManager(FilterProperties properties){
        return new WebFilterAutoRegistryManager(properties);
    }
}
  1. 常量
/**
 * @author : xlw
 * @since : 2023-09-08 13:58
 * FilterConstant
 */
public interface FilterConstant {

    String  FILTER_PREFIX = "my.filter";

    String DEFAULT_PACKAGE = "com.example.filter";
}
  1. 配置类
/**
 * @author : xlw
 * @since : 2023-09-08 13:56
 * FilterProperties
 * 过滤器相关配置信息
 */
@Component
@ConfigurationProperties(prefix = FilterConstant.FILTER_PREFIX)
public class FilterProperties {

    private List<String> scanPackages;

    private boolean enabled;

    public List<String> getScanPackages() {
        return scanPackages;
    }

    public void setScanPackages(List<String> scanPackages) {
        this.scanPackages = scanPackages;
    }

    public boolean isEnabled() {
        return enabled;
    }

    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }
}
  1. 使用的数据封装类

/**
 * @author : xlw
 * @since : 2023-09-08 10:59
 * WebInitParam
 */
public class WebInitParam {

    private String name;

    private String value;

    private String description="";

    public WebInitParam(String name, String value, String description) {
        this.name = name;
        this.value = value;
        if (description != null){
            this.description = description;
        }
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        if (description != null){
            this.description = description;
        }
    }
}

  1. 注册BeanDefinition

import com.ysxn.filter.annotation.YsxnFilter;
import com.ysxn.filter.config.FilterConstant;
import com.ysxn.filter.config.FilterProperties;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.boot.context.properties.bind.Bindable;
import org.springframework.boot.context.properties.bind.Binder;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.context.annotation.ScannedGenericBeanDefinition;
import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.filter.AnnotationTypeFilter;

import javax.servlet.Filter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author : xlw
 * @since : 2023-09-07 17:59
 * WebFilterAutoRegistry
 */
public class WebFilterAutoRegistryManager implements ApplicationContextAware, BeanDefinitionRegistryPostProcessor, ResourceLoaderAware, EnvironmentAware {

    private FilterProperties properties;

    private ResourceLoader resourceLoader;

    private Environment environment;

    private ApplicationContext applicationContext;


    public WebFilterAutoRegistryManager(FilterProperties properties) {
        this.properties = properties;
    }


    @Override
    public void setEnvironment(Environment environment) {
        this.environment = environment;
        // 绑定参数
        Bindable<FilterProperties> bindable = Bindable.ofInstance(properties);
        Binder binder = Binder.get(environment);
        binder.bind(FilterConstant.FILTER_PREFIX, bindable);
    }

    @Override
    public void setResourceLoader(ResourceLoader resourceLoader) {
        this.resourceLoader = resourceLoader;
    }

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
        registerBeanDefinitions( beanDefinitionRegistry);
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        System.out.println("");
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println(applicationContext);
    }

    public void registerBeanDefinitions(BeanDefinitionRegistry registry) {
        // 1. 初始化类扫描器, spring 提供扫描包路径下内容获取到BeanDefinition集合
        ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false, this.environment){
            @Override
            protected boolean isCandidateComponent(
                    AnnotatedBeanDefinition beanDefinition) {
                boolean isCandidate = false;
                if (beanDefinition.getMetadata().isIndependent()) {
                    if (!beanDefinition.getMetadata().isAnnotation()) {
                        isCandidate = true;
                    }
                }
                return isCandidate;
            }
        };

        // 2. 扫描器添加过滤条件,不是所有的类都需要
        scanner.setResourceLoader(this.resourceLoader);
        AnnotationTypeFilter filter = new AnnotationTypeFilter(YsxnFilter.class);
        scanner.addIncludeFilter(filter);// 添加注解类型过滤

        // 3. 获取BeanDefinition 列表
        List<String> scanPackages = properties.getScanPackages();
        Set<BeanDefinition> beanDefinitions = scanner.findCandidateComponents(FilterConstant.DEFAULT_PACKAGE);
        if (scanPackages != null && scanPackages.size()>0){
            for (String scanPackage : scanPackages) {
                beanDefinitions.addAll(scanner.findCandidateComponents(scanPackage));
            }
        }

        for (BeanDefinition beanDefinition : beanDefinitions) {
            ScannedGenericBeanDefinition annotatedBeanDefinition = (ScannedGenericBeanDefinition) beanDefinition;
            AnnotationMetadata annotationMetadata = annotatedBeanDefinition.getMetadata();

            // 4. 开始注册
            registerWebFilter(registry, annotationMetadata);

        }
    }

    private void registerWebFilter(BeanDefinitionRegistry registry, AnnotationMetadata metadata) {
        // 1. 获取注解参数
        Map<String, Object> attributes = metadata.getAnnotationAttributes(YsxnFilter.class.getCanonicalName());
        String className = metadata.getClassName();
        try {
            Object o = Class.forName(className).newInstance();
            if (!(o instanceof Filter)){
                // 没有实现javax.servlet.Filter接口,不进行注册处理
                return;
            }
            BeanDefinitionBuilder bdf = BeanDefinitionBuilder.genericBeanDefinition(WebFilterFactoryBean.class);
            Object initParams = attributes.get("initParams");
            List<WebInitParam> initParamList = new ArrayList<>();
            if (initParams != null){
                AnnotationAttributes[] attrs = (AnnotationAttributes[])initParams;
                for (AnnotationAttributes attr : attrs) {
                    initParamList.add(new WebInitParam(attr.getString("name"),
                            attr.getString("value"), attr.getString("description")));
                }
            }

            bdf.addPropertyValue("filter", o)
                    .addPropertyValue("order", attributes.get("order"))
                    .addPropertyValue("displayName", attributes.get("displayName"))
                    .addPropertyValue("initParams", initParamList)
                    .addPropertyValue("filterName", attributes.get("filterName"))
                    .addPropertyValue("servletNames", attributes.get("servletNames"))
                    .addPropertyValue("urlPatterns", attributes.get("urlPatterns"))
                    .addPropertyValue("dispatcherTypes", attributes.get("dispatcherTypes"))
                    .addPropertyValue("asyncSupported", attributes.get("asyncSupported"));
            AbstractBeanDefinition beanDefinition = bdf.getBeanDefinition();
            registry.registerBeanDefinition(className, beanDefinition);
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}


  1. FactoryBean实现

import org.springframework.beans.factory.FactoryBean;
import org.springframework.boot.web.servlet.FilterRegistrationBean;

import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author : xlw
 * @since : 2023-09-08 10:50
 * WebFilterFactoryBean
 */
public class WebFilterFactoryBean implements FactoryBean<FilterRegistrationBean> {

    private Filter filter;
    private Integer order=0;
    private String description;
    private String displayName = "";
    private List<WebInitParam> initParams;
    private String filterName = "";
    private String smallIcon = "";
    private String largeIcon = "";
    private List<String> servletNames;
    private List<String> value;
    private List<String> urlPatterns;
    private List<DispatcherType> dispatcherTypes;
    private Boolean asyncSupported = false;
    @Override
    public FilterRegistrationBean getObject() throws Exception {
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(filter);
        // 顺序号
        bean.setOrder(order==null?0:order);
        if (urlPatterns != null){
            urlPatterns.forEach(p->{
                bean.addUrlPatterns(p);
            });
        }
        if (initParams != null){
            Map<String, String> params = new HashMap<>();
            for (WebInitParam initParam : initParams) {
                params.put(initParam.getName(), initParam.getValue());
            }
            bean.setInitParameters(params);
        }

        if (filterName != null && !"".equals(filterName)){
            bean.setName(filterName);
        }

        if (servletNames != null){
            bean.setServletNames(servletNames);
        }

        if (dispatcherTypes != null ){
            int size = dispatcherTypes.size();
            if (size>1){
                DispatcherType[] dis = new DispatcherType[size-1];
                for (int i = 1; i < size; i++) {
                    dis[i] = dispatcherTypes.get(i);
                }
                bean.setDispatcherTypes(dispatcherTypes.get(0), dis);
            }else {
                bean.setDispatcherTypes(dispatcherTypes.get(0));
            }
        }else {
            bean.setDispatcherTypes(DispatcherType.REQUEST);
        }

        bean.setAsyncSupported(asyncSupported == null ? false:asyncSupported);


        return bean;
    }

    @Override
    public Class<?> getObjectType() {
        return FilterRegistrationBean.class;
    }

    public Filter getFilter() {
        return filter;
    }

    public void setFilter(Filter filter) {
        this.filter = filter;
    }

    public Integer getOrder() {
        return order;
    }

    public void setOrder(Integer order) {
        this.order = order;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getDisplayName() {
        return displayName;
    }

    public void setDisplayName(String displayName) {
        this.displayName = displayName;
    }

    public List<WebInitParam> getInitParams() {
        return initParams;
    }

    public void setInitParams(List<WebInitParam> initParams) {
        this.initParams = initParams;
    }

    public String getFilterName() {
        return filterName;
    }

    public void setFilterName(String filterName) {
        this.filterName = filterName;
    }

    public String getSmallIcon() {
        return smallIcon;
    }

    public void setSmallIcon(String smallIcon) {
        this.smallIcon = smallIcon;
    }

    public String getLargeIcon() {
        return largeIcon;
    }

    public void setLargeIcon(String largeIcon) {
        this.largeIcon = largeIcon;
    }

    public List<String> getServletNames() {
        return servletNames;
    }

    public void setServletNames(List<String> servletNames) {
        this.servletNames = servletNames;
    }

    public List<String> getValue() {
        return value;
    }

    public void setValue(List<String> value) {
        this.value = value;
    }

    public List<String> getUrlPatterns() {
        return urlPatterns;
    }

    public void setUrlPatterns(List<String> urlPatterns) {
        this.urlPatterns = urlPatterns;
    }

    public List<DispatcherType> getDispatcherTypes() {
        return dispatcherTypes;
    }

    public void setDispatcherTypes(List<DispatcherType> dispatcherTypes) {
        this.dispatcherTypes = dispatcherTypes;
    }

    public boolean isAsyncSupported() {
        return asyncSupported;
    }

    public void setAsyncSupported(boolean asyncSupported) {
        this.asyncSupported = asyncSupported;
    }
}

  1. 最后在spring.factories中添加配置,springboot自动装配灵魂配置(META-INF下创建的文件)
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.example.filter.config.EnableFilterAutoRegistryAutoConfiguration
  1. application.yml 中配置需要扫描的包路径(scanPackages)
my:
  filter:
    enabled: true
    scanPackages:
      - com.core.filter
      - com.core.filterd
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring IoC 的实现过程主要分为两个步骤:首先是通过配置文件或注解将需要管理的对象注册Spring 容器中,然后在需要使用这些对象的时候,通过容器来获取这些对象的实例。具体来说,Spring IoC 的实现过程包括以下几个步骤: 1. 配置文件或注解:在 Spring 中,我们可以通过 XML 配置文件或注解的方式来将需要管理的对象注册Spring 容器中。在配置文件中,我们可以使用 <bean> 标签来定义一个 Bean,指定其 ID 和 Class,以及其他的属性和依赖关系。在注解中,我们可以使用 @Component、@Service、@Controller 等注解来标记一个类,表示这个类是一个 Bean。 2. Bean 的实例化:当 Spring 容器启动时,会根据配置文件或注解中的信息,创建所有需要管理的 Bean 的实例。这个过程中,Spring 会根据配置文件或注解中的信息,使用反射机制来创建 Bean 的实例,并且自动解决 Bean 之间的依赖关系。 3. Bean 的装配:在 Bean 实例化之后,Spring 会根据配置文件或注解中的信息,将 Bean 之间的依赖关系进行装配。这个过程中,Spring 会根据配置文件或注解中的信息,自动将一个 Bean 中需要依赖的其他 Bean 注入到这个 Bean 中。 4. Bean 的生命周期:在 Spring 容器启动时,会创建所有需要管理的 Bean 的实例,并且自动解决 Bean 之间的依赖关系。在 Bean 实例化之后,Spring 会调用 Bean 的初始化方法,进行一些初始化操作。在 Spring 容器关闭时,会调用 Bean 的销毁方法,进行一些清理操作。 总之,Spring IoC 的实现过程主要是通过配置文件或注解将需要管理的对象注册Spring 容器中,并且在需要使用这些对象的时候,通过容器来获取这些对象的实例。 ### 回答2: Spring IoC(Inversion of Control,控制反转)是Spring框架的核心特性之一,它通过管理和控制应用中的对象依赖关系来实现Spring IoC的实现过程如下: 1. 根据应用的配置文件编写相应的Bean定义。Spring IoC容器通过读取配置文件,了解应用中需要管理的bean的信息,包括bean的类名、作用域、依赖关系等。 2. 创建和管理Bean实例。Spring IoC容器根据配置文件中的定义,实例化需要管理的Bean,并根据其作用域进行管理。例如,对于单例作用域的Bean,容器只会创建一个实例,并在整个应用中共享。 3. 处理Bean的依赖关系。Spring IoC容器会自动解析Bean之间的依赖关系,确保每个Bean都能获取到它所依赖的其他Bean。容器根据配置文件中的定义,进行依赖注入。常见的注入方式有构造函数注入、setter方法注入和字段注入。 4. 提供Bean的生命周期管理。Spring IoC容器负责管理Bean的生命周期,包括初始化和销毁。容器在实例化Bean之后,会调用其生命周期回调方法进行初始化操作;在容器关闭时,会调用Bean的销毁方法进行资源释放等操作。 5. 提供AOP(面向切面编程)支持。Spring IoC容器还提供了AOP的支持,通过将横切关注点(如日志记录、事务管理等)分离出来,使得系统的业务逻辑和其他关注点可以独立演化。 综上所述,Spring IoC通过配置文件和容器的管理,实现了对象的创建、依赖注入和生命周期管理,从而实现了对象之间的解耦和灵活性。通过使用Spring IoC,我们可以更方便地管理和控制应用中的对象,提高了代码的可维护性和可测试性。 ### 回答3: Spring IoC(Inversion of Control)是一种通过反转对象创建和管理的控制方式,它将对象的创建和依赖注入的过程交由IoC容器来管理。下面是Spring IoC的实现过程: 1. 配置文件定义:首先,我们需要在Spring配置文件或者使用注解方式(@ComponentScan、@Configuration等)来定义Bean的配置。配置文件包括Bean的名字、类路径和其他属性。 2. 加载配置文件:Spring IoC容器负责加载配置文件,并将其解析成内部数据结构。它读取配置文件中的内容,包括Bean的定义、依赖关系和其他属性。 3. 创建Bean实例:Spring IoC容器根据配置文件中定义的Bean的信息,创建Bean的实例。它使用Java反射机制来实例化对象,并提供了灵活的方式来自定义Bean的创建过程。可以通过构造方法、工厂方法或者使用第三方库进行Bean的创建。 4. 设置Bean属性:一旦Bean的实例创建完成,Spring IoC容器将会为Bean设置其对应的属性。这些属性可以通过Setter和Getter方法进行设置和获取。Spring IoC容器根据配置文件中定义的依赖关系,自动为Bean注入它所依赖的其他Bean。 5. Bean的生命周期管理:Spring IoC容器管理Bean的整个生命周期。它在Bean的实例创建完成之后,会调用初始化方法来完成一些初始化操作。同时,当Bean不再被使用时,容器会调用销毁方法来进行资源释放。 6. 提供Bean的引用:Spring IoC容器负责将Bean的引用提供给其他组件使用。其他组件可以通过调用容器提供的方法来获取Bean的实例,从而完成对Bean的操作和调用。 总结来说,Spring IoC实现的过程包括了配置文件的定义、加载和解析、Bean的实例化和属性设置、Bean的生命周期管理以及Bean的引用提供。通过这种方式,Spring IoC实现了对象的解耦和依赖的管理,提高了代码的灵活性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值