• 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注解,通过${}从配置文件中取值。

  • 相关阅读:
    Floyd_Warshall算法
    Bellman_Ford算法
    深度优先搜索
    广度优先搜索
    贪心算法_活动选择
    动态规划_0-1背包问题
    算法导论_动态规划_最长回文子序列
    算法导论_动态规划_最长公共子序列
    动态规划解决分割问题
    2016 Google中国开发者大会游记
  • 原文地址:https://www.cnblogs.com/jinchengll/p/12909066.html
Copyright © 2020-2023  润新知