博客
关于我
Spring笔记(2) - 生命周期/属性赋值/自动装配及部分源码解析
阅读量:422 次
发布时间:2019-03-06

本文共 3849 字,大约阅读时间需要 12 分钟。

Spring Framework开发指南:从基础到进阶

一、Bean的生命周期

1. 自定义初始化与销毁方法

Spring允许开发者自定义Bean的初始化和销毁逻辑,主要有以下几种实现方式:

XML方式:

@Bean方式:

@Bean(initMethod = "", destroyMethod = "")public Person person() {    System.out.println("注入容器。。。。。");    return new Person("张三", 20);}

接口实现方式:

@Componentpublic class Person implements InitializingBean, DisposableBean {    public Person() {        System.out.println("Person 。。。 constructor");    }    @Override    public void afterPropertiesSet() throws Exception {        System.out.println("Person 。。。afterPropertiesSet");    }    @Override    public void destroy() throws DestroyFailedException {        System.out.println("Person 。。。destroy");    }}

2. @PostConstruct和@PreDestroy

JSR-250规范提供了@PostConstruct和@PreDestroy注解,用于在Bean的生命周期中执行初始化和销毁逻辑:

@Componentpublic class Color {    public Color() {        System.out.println("Color 。。。 constructor");    }    @PostConstruct    public void init() throws Exception {        System.out.println("Color 。。。init");    }    @PreDestroy    public void destroy() {        System.out.println("Color 。。。destroy");    }}

3. BeanPostProcessor扩展

BeanPostProcessor接口允许开发者在Bean的初始化和销毁过程中添加自定义逻辑。以下是一个实现示例:

@Componentpublic class MyBeanPostProcessor implements BeanPostProcessor {    @Override    public Object postProcessBeforeInitialization(Object bean, String beanName) {        System.out.println("postProcessBeforeInitialization====》【" + bean + "】:" + beanName);        return bean;    }    @Override    public Object postProcessAfterInitialization(Object bean, String beanName) {        System.out.println("postProcessAfterInitialization====》【" + bean + "】:" + beanName);        return bean;    }}

4. 内部原理

从Spring的doCreateBean方法可以看出,Bean的初始化过程包括以下几个关键步骤:

  • populateBean:对Bean的属性进行赋值
  • initializeBean:调用applyBeanPostProcessorsBeforeInitializationapplyBeanPostProcessorsAfterInitialization,执行BeanPostProcessor的逻辑
  • 调用初始化方法
  • 调用销毁方法
  • 二、属性赋值

    1. @Value注解

    @Value注解用于注入基本类型值或SpEL表达式:

    public class Person {    @Value("张三")    private String name;    @Value("#{20-1}")    private Integer age;}

    2. @PropertySource注解

    @PropertySource用于读取外部配置文件:

    public class Person {    @Value("张三")    private String name;    @Value("#{20-1}")    private Integer age;    @Value("${sex}")    private String sex;}@propertysource(value = "classpath:/global.properties")public class BeanConfig {}

    三、自动装配

    1. Spring定义注解

    @Autowired/@Qualifier/@Primary

    @Servicepublic class UserService {    @Qualifier("userDao")    @Autowired    private UserDao userDao;    public void printf() {        System.out.println(userDao);    }}

    @Resource/@Inject(Java规范)

    public class UserService {    @Resource(name = "userDao")    private UserDao userDao;}

    2. Aware注入

    Spring提供了一些Aware接口,用于注入Spring底层组件:

    public class Color implements ApplicationContextAware {    private ApplicationContext applicationContext;    @Override    public void setApplicationContext(ApplicationContext applicationContext) {        this.applicationContext = applicationContext;    }}

    3. 环境配置

    @Profile注解用于指定Bean在特定环境下注册:

    @PropertySource("classpath:/db.properties")@Configurationpublic class BeanProfileConfig {    @Value("${db.user}")    private String user;    @Value("${db.driverClass}")    private String driverClass;    @Profile("test")    @Bean    public DataSource testDataSource(@Value("${db.password}") String pwd) {        //数据库配置...    }    @Profile("dev")    @Bean    public DataSource devDataSource(@Value("${db.password}") String pwd) {        //数据库配置...    }    @Profile("pro")    @Bean    public DataSource proDataSource(@Value("${db.password}") String pwd) {        //数据库配置...    }}

    四、使用示例

    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BeanConfig.class);context.register(BeanProfileConfig.class);context.setEnvironment(new StandardEnvironment().addProperty("spring.profiles.active", "test"));context.refresh();

    转载地址:http://blluz.baihongyu.com/

    你可能感兴趣的文章
    Python 写Android App性能:入门到高级
    查看>>
    python 写入json数据到数据库
    查看>>
    Python 出现 TypeError: ‘encoding‘ is an invalid keyword argument for this function 解决方法
    查看>>
    python 出现 TypeError: ‘list‘ object is not callable 的解决方法
    查看>>
    python 函数1
    查看>>
    python 函数学习
    查看>>
    Python 分析天气,告诉你中秋应该去哪里
    查看>>
    python 列表中dict中key排序
    查看>>
    Python 列表删除相同的元素
    查看>>
    Python 初学者需要知道的四条建议
    查看>>
    Python 判断字符串是否包含子字符串
    查看>>
    python 判断当前时间是否为零点
    查看>>
    python 利用pandas读取本地中CSV文件的指定列 列名重命名 并保存回本地
    查看>>
    python 利用pyspark读取HDFS中CSV文件的指定列 列名重命名 并保存回HDFS
    查看>>
    python 利用pyttsx3文字转语音
    查看>>
    python 利用已有Ner模型进行数据清洗合并
    查看>>
    python 到大数据开发工程师_如何成为一个大数据开发工程师?
    查看>>
    python 加密解密(base64, AES)
    查看>>
    Python 和Java 哪个更适合做自动化测试?
    查看>>
    python 图片转ico
    查看>>