Java Spring Bean 的几种加载方式

写这篇文章的主要目的还是为了记录自己的笔记,如果有哪些不足的地方,还望指出

8 种bean的加载方式

1. xml + bean 形式

第一种方式是最基础的,也是我们最熟悉的,使用xml直接配置bean,方法如下!

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--注入 user bean 对象-->
    <bean id="user" class="com.small.bean.User" ></bean>
</beans>
// main 方法
public class Application {
    public static void main(String[] args) {
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        Object userBean = app.getBean(User.class);
        System.out.println(userBean);
    }
}

2. xml + context + 注解

使用@component 注解方式,或者其他的例如 @controller ,@service ,@Resposity , @Bean 定义bean对象.

@Component // 加入该注解,并在配置文件声明包扫描
public class User {
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
            ">

    <!--    配置组件/包扫描-->
    <context:component-scan base-package="com.small.bean"></context:component-scan>

</beans>
// main 方法
public class Application {
    public static void main(String[] args) {
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        Object userBean = app.getBean(User.class);
        System.out.println(userBean);
    }
}

3. 配置类 + 扫描 + 注解

// 配置类 + 扫描
@Configuration
@ComponentScan(basePackages = "com.small")
public class MyConfig {

}
// 注解
@Component
public class User {
}
// main 方法
public class Application {
    public static void main(String[] args) {
        ApplicationContext app = new AnnotationConfigApplicationContext(MyConfig.class);
        Object userBean = app.getBean(User.class);
        System.out.println(userBean);
    }
}

4. @Import 导入加载的bean

// 配置类
@Import(User.class)
public class MyConfig {
}
// bean 类 此时无须声明该类为bean类
public class User {
}
// main 方法
public class Application {
    public static void main(String[] args) {
        ApplicationContext app = new AnnotationConfigApplicationContext(MyConfig.class);
        Object userBean = app.getBean(User.class);
        System.out.println(userBean);
    }
}

此形式可以有效降低源代码与Spring的耦合度,在Spring底层及诸多框架中大量使用

5. AnnotationConfigApplicationContext 调用 register 方法

// 配置类
public class MyConfig {
}

// bean 类
public class User {
}

// main 方法
public class Application {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(MyConfig.class);
        app.register(User.class);

        Object userBean = app.getBean(User.class);
        System.out.println(userBean);
    }
}

6. @Import 导入ImportSelector接口

实现对导入源的编程式处理

// MyImportSelector 类
public class MyImportSelector implements ImportSelector {
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        boolean flag = annotationMetadata.hasAnnotation("org.springframework.context.annotation.Import");
        if (flag) {
            return new String[]{"com.small.bean.People"};
        }
        return new String[]{"com.small.bean.User"};
    }
}
// 配置类
@Import(MyImportSelector.class)
public class MyConfig {
}
// bean 类
public class People {
}
public class User{
}

// main 方法
public class Application {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(MyConfig.class);
        Object userBean = app.getBean(People.class);
        System.out.println(userBean);
    }
}

7. @Import 导入ImportBeanDefinitionRegistrar接口

导入实现了ImportBeanDefinitionRegistrar接口的类,通过BeanDefinition的注册器注册实名bean,实现对容器中bean的裁定,例如对现有bean的覆盖,进而达成不修改源代码的情况下更换实现的效果

// 配置类
@Import(MyImportBeanDefinitionRegistrar.class)
public class MyConfig {
}

// MyImportBeanDefinitionRegistrar 类
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
                                        BeanDefinitionRegistry registry) {
        BeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(User.class).getBeanDefinition();
        registry.registerBeanDefinition("user", beanDefinition);
    }
}
// bean 类
public class User {
}

// main 方法
public class Application {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(MyConfig.class);
        Object userBean = app.getBean(User.class);
        System.out.println(userBean);
    }
}

8. @Import 导入BeanDefinitionRegistryPostProcessor接口

导入实现了BeanDefinitionRegistryPostProcessor接口的类,通过BeanDefinition的注册器注册实名bean,实现对容器中bean的最终裁定

// 配置类
@Import(MyPostProcessor.class)
public class MyConfig {
}

// MyPostProcessor 类
public class MyPostProcessor implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
        BeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(User.class).getBeanDefinition();
        registry.registerBeanDefinition("user", beanDefinition);
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

    }


}
// bean 类
public class User {
}

// 主函数
public class Application {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(MyConfig.class);
        Object userBean = app.getBean(User.class);
        System.out.println(userBean);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦琦不是MQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值