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

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

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

一、Bean的生命周期

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

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

XML方式:

@Bean方式:

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

接口实现方式:

@Component
public 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的生命周期中执行初始化和销毁逻辑:

@Component
public 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的初始化和销毁过程中添加自定义逻辑。以下是一个实现示例:

@Component
public 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

    @Service
    public 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")
    @Configuration
    public 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/

    你可能感兴趣的文章
    Objective-C实现高斯消元法(附完整源码)
    查看>>
    office中的所有content type
    查看>>
    Oil Deposits
    查看>>
    OJ中处理超大数据的方法
    查看>>
    OJ中常见的一种presentation error解决方法
    查看>>
    OK335xS UART device registe hacking
    查看>>
    ok6410内存初始化
    查看>>
    Okhttp3添加拦截器后,报错,java.io.IOException: unexpected end of stream on okhttp3.Address
    查看>>
    OKR为什么到今天才突然火了?
    查看>>
    ollama-python-Python快速部署Llama 3等大型语言模型最简单方法
    查看>>
    ollama本地部署DeepSeek(Window图文说明)
    查看>>
    On Error GOTO的好处
    查看>>
    onclick事件的基本操作
    查看>>
    onCreate()方法中的参数Bundle savedInstanceState 的意义用法
    查看>>
    OneASP 安全公开课,深圳站, Come Here, Feel Safe!
    查看>>
    OneBlog Shiro 反序列化漏洞复现
    查看>>
    one_day_one--mkdir
    查看>>
    ONI文件生成与读取
    查看>>
    onlyoffice新版5.1.2版解决中文汉字输入重复等问题
    查看>>
    oobbs开发手记
    查看>>