Spring注解驱动开发2:生命周期和属性赋值

Spring注解驱动开发系列:

  1. Spring注解驱动开发1:组件注册
  2. Spring注解驱动开发2:生命周期和属性赋值
  3. Spring注解驱动开发3:自动装配
  4. Spring注解驱动开发4:AOP使用和原理
  5. Spring注解驱动开发5:Spring声明式事务
  6. Spring注解驱动开发6:Spring扩展原理

Spring注解驱动开发2:生命周期和属性赋值

@Bean指定初始化和销毁方法

Bean的生命周期:bean的创建==>初始化==>销毁

在上一篇文章中,bean的生命周期都由spring容器管理,

我们可以自定义bean的初始化和销毁方法,容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法。

例子

编写UserDao代码如下:

public class UserDao {
    public UserDao() {
        System.out.println("UserDao 构造函数");
    }

    public void init() {
        System.out.println("userdao init....");
    }

    public void destory() {
        System.out.println("userdao destory...");
    }

}

编写MainTest代码如下:

public class MainTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new
                AnnotationConfigApplicationContext(MainConfigure.class);
        UserDao userDao = (UserDao) applicationContext.getBean("userDao");
        applicationContext.close();
    }
}

执行MainTest得到输出:

UserDao 构造函数
userdao init....
userdao destory...

自定义的初始化和销毁方法都成功执行。

BeanPostProcessor-bean的后置处理器

在Bean初始化前后进行一些处理工作。

例子

编写MyBeanPostProcessor,代码如下:

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
    //在bean初始化之前执行
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof UserDao) {
            System.out.println("process 执行init");
            ((UserDao) bean).init();
        }
        return bean;
    }

    //在bean初始化之后执行
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof UserDao) {
            System.out.println("process 执行destory");
            ((UserDao) bean).destory();
        }
        return bean;
    }
}

编写配置文件MainConfigure如下:

//配置类==配置文件
@Configuration
//开启自动包扫描,传入要扫描的包路径
@ComponentScan(basePackages = "com.lin.springL")
public class MainConfigure {
}

编写MainTest代码如下:

public class MainTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new
                AnnotationConfigApplicationContext(MainConfigure.class);
    }
}

执行得到结果:

UserDao 构造函数
process 执行init
userdao init....
process 执行destory
userdao destory...

自定义的MyBeanPostProcessor在bean的初始化前后分别被调用。

扩展

在Spring底层,使用了很多BeanPostProcessor来对Bean进行增强,像生成代理对象,或者对一些注释进行处理来增强bean的功能。

例如@Autowired这个注解,可以在后置处理器中对其注释的属性进行赋值。

@Value-赋值

对Bean中的属性进行赋值操作。

例子

编写User类为如下代码:

@Component
public class User {
    @Value("lin")
    private String name;
    @Value("23")
    private int age;

    public User() {

    }
    ...

编写MainTest为如下代码:

public class MainTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new
                AnnotationConfigApplicationContext(MainConfigure.class);
        User user = (User) applicationContext.getBean("user");
        System.out.println(user);
    }
}

运行得到输出如下:

User{name='lin', age=23}

可以看到在Bean创建的时候根据Value设置的值为初始值。

@PropertySource-加载外部配置文件

如果值需要从外部文件读入,可以在MainConfigure文件中加入注解@PropertySource来加载外部配置文件。

例子

更改MainConfigure文件的代码如下:

//配置类==配置文件
@Configuration
//开启自动包扫描,传入要扫描的包路径
@ComponentScan(basePackages = "com.lin.springL")
//加载外部文件
@PropertySource(value = "路径")
public class MainConfigure {
}

然后使用上面提到的@Value注解,通过${}从配置文件中取值。

原文地址:https://www.cnblogs.com/jinchengll/p/12909066.html